Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
1

Передача параметров

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

Author24 — интернет-сервис помощи студентам
Добрый день!
Столкнулся со следующей ситуацией. При передаче 2-х мерного статического массива по указателю, в ф-ции, принимающей фактический параметр, происходит обращение к нулевому указателю. Одномерный массив передаётся прекрасно, но что не так с двухмерным?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2010, 23:04
Ответы с готовыми решениями:

Передача параметров
Ребят, в общем было задание такое: Есть объект (прямоугольник). У него есть сигналы свои - 7 штук....

передача параметров в функцию
Здарвствуйте! Неделю изучаю С++, и в книге по которой изучаю сказано: "Передавать параметры по...

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

Передача параметров в функцию
Доброго времени суток. В ф-и есть несколько параметров-констант(const char*). Как передать в нее...

15
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
19.11.2010, 23:07 2
alexsvk, Код покажите где у Вас
При передаче 2-х мерного статического массива по указателю, в ф-ции, принимающей фактический параметр, происходит обращение к нулевому указателю
.
0
9 / 9 / 0
Регистрация: 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"); // здесь ошибка обращения к нулевому указателю
}
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
19.11.2010, 23:48 4
alexsvk, Слишком мал кусочек кода что-бы сделать выводы, давайте весь код.
0
9 / 9 / 0
Регистрация: 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 такая проблема.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
20.11.2010, 00:01 6
Опять не полный код, только догадываться можно:
- Вы элементам массива
static HWND hBut [30] [63];
что-нибудь присваивали.
- Когда вызываете функцию void _Cross:raw(HWND **ptr,int i, int j), то i и j какие значения имеют?
- Organism объект класса _Cross?
0
9 / 9 / 0
Регистрация: 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.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
20.11.2010, 00:55 8
А по-поводу
- Вы элементам массива
static HWND hBut [30] [63];
что-нибудь присваивали.
что-нибудь прольете на свет или тайна?
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
20.11.2010, 01:48  [ТС] 9
Цитата Сообщение от valeriikozlov Посмотреть сообщение
А по-поводу
что-нибудь прольете на свет или тайна?
Услышал краем уха, что static передавать нельзя через параметры. Почему вот только?
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
20.11.2010, 02:03 10
Я тоже услышал краем уха, что static передавать через параметры можно. Но на всякий случай напишу что нельзя. Вдруг пригодится. В партизан будем дальше играть, может кто и выиграет. На всякий случай сообщаю, что я не телепат. Подождите, может завтра утром выйдут в форум другие люди, может среди них окажутся телепаты, тогда помогут...
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
20.11.2010, 02:44  [ТС] 11
Честно, не пойму что ещё нужно выложить.
Программа не маленькая, всё выкладывать, "намыливая" глаза другим, - смысла нет.
Скажите, что ещё нужно показать
0
Заблокирован
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 - длина строки (одного из измерений) массива. Собственно, она и не известна компилятору.
0
9 / 9 / 0
Регистрация: 15.07.2010
Сообщений: 255
20.11.2010, 12:47  [ТС] 13
Цитата Сообщение от NightmareZ Посмотреть сообщение
Шикарно. Как по-твоему должен индексироваться двухмерный массив, когда известен только указатель на него?

Код
C++
1
ptr[i][j]
будет развёрнут в
C++
1
*((HWND*)ptr + i * width + j)
где width - длина строки (одного из измерений) массива. Собственно, она и не известна компилятору.
А какое решение проблемы?
0
Заблокирован
20.11.2010, 16:35 14
Цитата Сообщение от alexsvk Посмотреть сообщение
А какое решение проблемы?
Передать width
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
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], ...)
}
Массив будет передаваться ПО КОСВЕННОСТИ (по указателю, а не по значению)
0
Заблокирован
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], ...)
}
Массив будет передаваться ПО КОСВЕННОСТИ (по указателю, а не по значению)
Я так думаю, всё же нехорошо жёстко задавать в параметре функции размеры массива.

Даже, если в данный момент, нужен фиксированный массив.
0
20.11.2010, 17:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2010, 17:41
Помогаю со студенческими работами здесь

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

Передача дефолтных параметров
Объясню проблему на примере: class TMyControl { public: TMyControl(int param1 = 100,...

Передача параметров в функцию
void f(int a) ; // передача по значению void f(int *a);//передача по ссылке void f(int &a) ;...

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru