Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
#1

Передача параметров - C++

19.11.2010, 23:04. Просмотров 1451. Ответов 15
Метки нет (Все метки)

Добрый день!
Столкнулся со следующей ситуацией. При передаче 2-х мерного статического массива по указателю, в ф-ции, принимающей фактический параметр, происходит обращение к нулевому указателю. Одномерный массив передаётся прекрасно, но что не так с двухмерным?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2010, 23:04     Передача параметров
Посмотрите здесь:

Передача параметров по ссылке - C++
У кого есть рабочий вариант сего чуда ? (К примеру,функции квадратного корня).В учебнике не работает.

Передача параметров (функция) - C++
Помогите,пожалуйста написать (ДОПИСАТЬ) программу на C++. Создать функцию, которая принимает на вход дат рождения и текущую дату...

Передача параметров в функцию - C++
Люди помогите, пожалуйста. Есть такая простая задачка: В одномерном массиве, состоящем из n элементов вычислить произведение...

Передача параметров в функции - C++
Здравствуйте Помогите, пожалуйста, разобраться с передачей параметров. Задание : создать класс "Треугольник", определить углы и тип...

Передача параметров в классе - C++
Нужно чтобы программа рассчитывала стоимость драгоценного камня и стоимость его огранки. И все это должно быть сделано через класс и...

Передача параметров функции - C++
Добрый день! Помогите, пожалуйста с передачей параметров по функциям. Как использовать функцию check2 в функции...

Передача параметров функции - C++
доброго времени суток:) есть программа реализующая метод градиентного спуска. но да это неважно есть функция Norm. значение этой...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
19.11.2010, 23:07     Передача параметров #2
alexsvk, Код покажите где у Вас
При передаче 2-х мерного статического массива по указателю, в ф-ции, принимающей фактический параметр, происходит обращение к нулевому указателю
.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
19.11.2010, 23:38  [ТС]     Передача параметров #3
Цитата Сообщение от valeriikozlov Посмотреть сообщение
alexsvk, Код покажите где у Вас .
C++
1
2
3
4
5
Organism->Draw(hBut,i,j);// где hBut типа HWND**
void _Cross::Draw(HWND **ptr,int i, int j)
{
    SendMessage(ptr[i][j],WM_SETTEXT,(WPARAM)0,(LPARAM)"X"); // здесь ошибка обращения к нулевому указателю
}
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
19.11.2010, 23:48     Передача параметров #4
alexsvk, Слишком мал кусочек кода что-бы сделать выводы, давайте весь код.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
19.11.2010, 23:53  [ТС]     Передача параметров #5
Цитата Сообщение от valeriikozlov Посмотреть сообщение
alexsvk, Слишком мал кусочек кода что-бы сделать выводы, давайте весь код.
Цитата Сообщение от alexsvk Посмотреть сообщение
C++
1
2
3
4
5
6
7
static HWND hBut [30] [63];
Organism->Draw(hBut,i,j);// где hBut типа HWND**
void _Cross::Draw(HWND **ptr,int i, int j)
{
 
    SendMessage(ptr[i][j],WM_SETTEXT,(WPARAM)0,(LPARAM)"X"); // здесь ошибка обращения к нулевому указателю
}
отредактировал, только из-за static такая проблема.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.11.2010, 00:01     Передача параметров #6
Опять не полный код, только догадываться можно:
- Вы элементам массива
static HWND hBut [30] [63];
что-нибудь присваивали.
- Когда вызываете функцию void _Cross:raw(HWND **ptr,int i, int j), то i и j какие значения имеют?
- Organism объект класса _Cross?
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
20.11.2010, 00:51  [ТС]     Передача параметров #7
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Опять не полный код, только догадываться можно:
- Вы элементам массива что-нибудь присваивали.
- Когда вызываете функцию void _Cross:raw(HWND **ptr,int i, int j), то i и j какие значения имеют?
- Organism объект класса _Cross?
i = 0, j = 0;
Organism - указатель на class Drawer, наследником от которого является _Cross.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.11.2010, 00:55     Передача параметров #8
А по-поводу
- Вы элементам массива
static HWND hBut [30] [63];
что-нибудь присваивали.
что-нибудь прольете на свет или тайна?
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
20.11.2010, 01:48  [ТС]     Передача параметров #9
Цитата Сообщение от valeriikozlov Посмотреть сообщение
А по-поводу
что-нибудь прольете на свет или тайна?
Услышал краем уха, что static передавать нельзя через параметры. Почему вот только?
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.11.2010, 02:03     Передача параметров #10
Я тоже услышал краем уха, что static передавать через параметры можно. Но на всякий случай напишу что нельзя. Вдруг пригодится. В партизан будем дальше играть, может кто и выиграет. На всякий случай сообщаю, что я не телепат. Подождите, может завтра утром выйдут в форум другие люди, может среди них окажутся телепаты, тогда помогут...
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
20.11.2010, 02:44  [ТС]     Передача параметров #11
Честно, не пойму что ещё нужно выложить.
Программа не маленькая, всё выкладывать, "намыливая" глаза другим, - смысла нет.
Скажите, что ещё нужно показать
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
20.11.2010, 03:29     Передача параметров #12
Цитата Сообщение от alexsvk Посмотреть сообщение
C++
1
2
3
4
void _Cross::Draw(HWND **ptr,int i, int j)
{
    SendMessage(ptr[i][j],WM_SETTEXT,(WPARAM)0,(LPARAM)"X");
}
Шикарно. Как по-твоему должен индексироваться двухмерный массив, когда известен только указатель на него?

Код
C++
1
ptr[i][j]
будет развёрнут в
C++
1
*((HWND*)ptr + i * width + j)
где width - длина строки (одного из измерений) массива. Собственно, она и не известна компилятору.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
20.11.2010, 12:47  [ТС]     Передача параметров #13
Цитата Сообщение от NightmareZ Посмотреть сообщение
Шикарно. Как по-твоему должен индексироваться двухмерный массив, когда известен только указатель на него?

Код
C++
1
ptr[i][j]
будет развёрнут в
C++
1
*((HWND*)ptr + i * width + j)
где width - длина строки (одного из измерений) массива. Собственно, она и не известна компилятору.
А какое решение проблемы?
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
20.11.2010, 16:35     Передача параметров #14
Цитата Сообщение от alexsvk Посмотреть сообщение
А какое решение проблемы?
Передать width
Evg
Эксперт CАвтор FAQ
17463 / 5701 / 361
Регистрация: 30.03.2009
Сообщений: 15,652
Записей в блоге: 26
20.11.2010, 17:10     Передача параметров #15
Цитата Сообщение от alexsvk Посмотреть сообщение
отредактировал, только из-за static такая проблема.
Кода из поста #5 вполне достаточно, чтобы понять суть проблемы. Массив, при передаче параметров передаётся как указатель на массив. А параметр HWND **ptr - это указатель на массив указателей (что совсем не то). Язык Си не позволяет напрямую передавать многомерные массивы параметром без указания измерений. Static тут не при чём

Посмотрим пост #9 в этой теме: Функции, передача массива в качестве параметра

Добавлено через 4 минуты
Хотя если у тебя нужно передавать массив с фиксированными измерениями, то надо писать

C
1
2
3
4
5
6
static HWND hBut [30][63];
Organism->Draw(hBut,i,j);
void _Cross::Draw(HWND arr[30][63], int i, int j)
{
  SendMessage(arr[i][j], ...)
}
Массив будет передаваться ПО КОСВЕННОСТИ (по указателю, а не по значению)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2010, 17:41     Передача параметров
Еще ссылки по теме:

Передача параметров в функцию - C++
Можно ли сделать так, чтобы при совпадении переменных в функцие и основной программе, значения изменялись и в основной программе? И еще,...

Передача параметров по ссылке - C++
Стоит ли передавать все параметры (кроме скалярных и указателей) по сслыке? Т.е. вместо void doSomething(const int _count, const...

Передача параметров, оператор << - C++
Я вот решил написать простенькую программку на свеже скачанной среде. Программка создает функцию, которая перемножает 2 числа а также...

Передача параметров в функцию - C++
Добрый вечер Не получается передать в функцию массив выдает ошибку #include &lt;cstdio&gt; struct morse_code { const char*...

Передача параметров в функцию - C++
Толи я чего-то туплю, толи всё же в мейн ошибка. Итак: есть функция, которая должна сообщать о результатах поиска изменением переменных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
NightmareZ
1339 / 562 / 37
Регистрация: 31.03.2009
Сообщений: 1,918
20.11.2010, 17:41     Передача параметров #16
Цитата Сообщение от Evg Посмотреть сообщение
Кода из поста #5 вполне достаточно, чтобы понять суть проблемы. Массив, при передаче параметров передаётся как указатель на массив. А параметр HWND **ptr - это указатель на массив указателей (что совсем не то). Язык Си не позволяет напрямую передавать многомерные массивы параметром без указания измерений. Static тут не при чём

Посмотрим пост #9 в этой теме: Функции, передача массива в качестве параметра

Добавлено через 4 минуты
Хотя если у тебя нужно передавать массив с фиксированными измерениями, то надо писать

C
1
2
3
4
5
6
static HWND hBut [30][63];
Organism->Draw(hBut,i,j);
void _Cross::Draw(HWND arr[30][63], int i, int j)
{
  SendMessage(arr[i][j], ...)
}
Массив будет передаваться ПО КОСВЕННОСТИ (по указателю, а не по значению)
Я так думаю, всё же нехорошо жёстко задавать в параметре функции размеры массива.

Даже, если в данный момент, нужен фиксированный массив.
Yandex
Объявления
20.11.2010, 17:41     Передача параметров
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru