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

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

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

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

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

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

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

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

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

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

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

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

15
valeriikozlov
Эксперт С++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
19.11.2010, 23:07 #2
alexsvk, Код покажите где у Вас
При передаче 2-х мерного статического массива по указателю, в ф-ции, принимающей фактический параметр, происходит обращение к нулевому указателю
.
0
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"); // здесь ошибка обращения к нулевому указателю
}
0
valeriikozlov
Эксперт С++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
19.11.2010, 23:48 #4
alexsvk, Слишком мал кусочек кода что-бы сделать выводы, давайте весь код.
0
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 такая проблема.
0
valeriikozlov
Эксперт С++
4670 / 2496 / 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?
0
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.
0
valeriikozlov
Эксперт С++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.11.2010, 00:55 #8
А по-поводу
- Вы элементам массива
static HWND hBut [30] [63];
что-нибудь присваивали.
что-нибудь прольете на свет или тайна?
0
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
20.11.2010, 01:48  [ТС] #9
Цитата Сообщение от valeriikozlov Посмотреть сообщение
А по-поводу
что-нибудь прольете на свет или тайна?
Услышал краем уха, что static передавать нельзя через параметры. Почему вот только?
0
valeriikozlov
Эксперт С++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.11.2010, 02:03 #10
Я тоже услышал краем уха, что static передавать через параметры можно. Но на всякий случай напишу что нельзя. Вдруг пригодится. В партизан будем дальше играть, может кто и выиграет. На всякий случай сообщаю, что я не телепат. Подождите, может завтра утром выйдут в форум другие люди, может среди них окажутся телепаты, тогда помогут...
0
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
20.11.2010, 02:44  [ТС] #11
Честно, не пойму что ещё нужно выложить.
Программа не маленькая, всё выкладывать, "намыливая" глаза другим, - смысла нет.
Скажите, что ещё нужно показать
0
NightmareZ
1358 / 563 / 37
Регистрация: 31.03.2009
Сообщений: 1,933
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
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 - длина строки (одного из измерений) массива. Собственно, она и не известна компилятору.
А какое решение проблемы?
0
NightmareZ
1358 / 563 / 37
Регистрация: 31.03.2009
Сообщений: 1,933
20.11.2010, 16:35 #14
Цитата Сообщение от alexsvk Посмотреть сообщение
А какое решение проблемы?
Передать width
0
Evg
Эксперт CАвтор FAQ
17941 / 6172 / 411
Регистрация: 30.03.2009
Сообщений: 16,942
Записей в блоге: 27
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2010, 17:10
Привет! Вот еще темы с ответами:

Передача параметров по ссылке - C++
Вот задание: С клавиатуры вводится число, передается в вызываемую функцию, в ней найти сумму делителей и их число. Результат работы...

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
20.11.2010, 17:10
Ответ Создать тему
Опции темы

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