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

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

Войти
Регистрация
Восстановить пароль
 
 
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 169
#1

Где ошибка в передаче указателя на массив? - C++

27.06.2014, 12:48. Просмотров 629. Ответов 24
Метки нет (Все метки)

через указатель на массив хочу в массив записать значние -1 или +1. гдето ошибка в синтаксисе. ПРошу помочь. ПОдозреваю что ошибка в самом вызове функции... А конкретней я не правильно из main`a вызываю нужную функцию. НО значения в определении функции и инициализации функции принимаю правлиьно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <stdlib.h>
using namespace std;
 
int InputLocPl1(int gor, int ver, int playID);
int fNumField(int[B] *pNumField, int s[/B], int playID, int ver, int gor);
 
 
int main(){
    
    setlocale(0,"");
    
    int playID;
    int gor, ver;
    
    int s=3;    
    int *pNumField;
 
    //1) Создание первоначального игрового поля. С пустыми значениями.
    //  а) Дубликат массива для инициализации его цифровыми занчениями.
    int NumField[s][s];
    
    cout    << "NumField: \n"; // забиваю значение пустой ячейки массива.
    for(int i=0; i<3; i++){
        for(int a=0; a<3; a++){
            NumField[i][a] = 0;
        }
    cout    << endl;        
    }
    
    cout    << "NumField[s][s] : \n"; // вывожу все забитые значения ячеек.
    for(int i=0; i<3; i++){
        for(int a=0; a<3; a++){
            cout    << NumField[i][a];
        }
    cout    << endl;        
    }
        
    //Иниц. Игровых массивов указателям.
    pNumField = &NumField[s][s];
    
    InputLocPl1(gor, ver, playID); // вводим координаты.
    fNumField[B](*pNumField, playID,[/B] ver, gor);//show new playfield
        
    
    return 0;
}
//2) Предложение ввести координаты. 
int InputLocPl1(int gor, int ver, int playID){
    cout    << "Игрок номер 1 введите координаты ячейки: Строка-Колонка...\n";
    
    int g, v;
    cout    <<"По-горизонтали: ";
    cin     >> g;
    cout    <<"По-вертикали: ";
    cin     >> v;
    
    gor = g+1;
    ver = v+1;
    playID = 1;
    
    return gor, ver, playID;
};
 
 
// очистка консоли.
// заполнение основног омассива  х ли 0.
int fNumField([B]int *pNumField, int s[/B], int playID, int ver, int gor){
    system("cls"); // очистка консоли.
    int plId;
    
    if(playID = 1) // определение 1 или -1 записывать в ячейку.
        plId = +1;
    
    
    else if(playID= 2) // определение 1 или -1 записывать в ячейку.
        plId = -1;
    
    
    int i=0, k=0;
    
    for(i; i<3; ++i){}// write -1 or 1 in stack
        for(k; k<3; ++k){
            if(i == ver && k == gor)
                *pNumField[k]=plId;
        }       
    }
    
    for(int i=0; i<3; ++i){ //show writen storage(mem. stack)
        for(int k=0; k<3; ++k){
            cout    << *pNumField[k];           
        }
    }
    return *pNumField[s];
}
Добавлено через 37 секунд
Строки 6, 43 и 68
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2014, 12:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Где ошибка в передаче указателя на массив? (C++):

Ошибка при передаче в функцию указателя на элемент массива - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; #include &lt;cmath&gt; const int n = 20; int...

При передачи указателя на обьект ошибка,а при передаче ссылки на указатель нет. Почему? - C++
Hi All! class SomeObj { public: int x; }

Ошибка Access violation при передаче указателя в функцию - C++
выделяю память для нужд програмных и соханяю его. char *resadres =(char*) VirtualAlloc (0, 50000, MEM_COMMIT | MEM_RESERVE,...

Использование указателя при передаче параметра - C++
Добрый вечер! Надо оформить функцию &quot;LoadTexture&quot;. Вот задачка: IDirect3DTexture9 *tex; LoadTexture(???tex); ... ...

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

Ошибки преобразования при передаче указателя на функцию - C++
Есть функция SQLITE_API int SQLITE_STDCALL sqlite3_exec( sqlite3*, /* An open database */ const...

24
Kerry_Jr
Модератор
Эксперт PHP
2203 / 1999 / 700
Регистрация: 14.05.2014
Сообщений: 5,861
Записей в блоге: 1
Завершенные тесты: 5
27.06.2014, 14:21 #16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
#include <stdlib.h>
using namespace std;
 
void InputLocPl1(int &gor, int &ver, int &playID);
void fNumField(int *pNumField, int s, int playID, int ver, int gor);
 
 
int main(){
    
    setlocale(0,"");
    
    int playID;
    int gor, ver;
    
    int s=3;    
    int *pNumField;
 
    //1) Создание первоначального игрового поля. С пустыми значениями.
    //  а) Дубликат массива для инициализации его цифровыми занчениями.
    int NumField[s][s];
    
    cout    << "NumField: \n"; // забиваю значение пустой ячейки массива.
    for(int i=0; i<3; i++){
        for(int a=0; a<3; a++){
            NumField[i][a] = 0;
        }
    cout    << endl;        
    }
    
    cout    << "NumField[s][s] : \n"; // вывожу все забитые значения ячеек.
    for(int i=0; i<3; i++){
        for(int a=0; a<3; a++){
            cout    << NumField[i][a];
        }
    cout    << endl;        
    }
        
    //Иниц. Игровых массивов указателям.
    pNumField = &NumField[0][0];
    
    InputLocPl1(gor, ver, playID); // вводим координаты.
    fNumField(pNumField, s, playID, ver, gor);//show new playfield
        
    
    return 0;
}
//2) Предложение ввести координаты. 
void InputLocPl1(int &gor, int &ver, int &playID){
    cout    << "Игрок номер 1 введите координаты ячейки: Строка-Колонка...\n";
    
    int g, v;
    cout    <<"По-горизонтали: ";
    cin     >> g;
    cout    <<"По-вертикали: ";
    cin     >> v;
    
    gor = g-1;
    ver = v-1;
    playID = 1;
};
 
 
// очистка консоли.
// заполнение основног омассива  х ли 0.
void fNumField(int *pNumField, int s, int playID, int ver, int gor){
    system("cls"); // очистка консоли.
    int plId;
    
    if(playID = 1) // определение 1 или -1 записывать в ячейку.
        plId = +1;
    
    
    else if(playID= 2) // определение 1 или -1 записывать в ячейку.
        plId = -1;
    
    
    int i, k;
    
    for(i = 0 ; i<s; ++i){// write -1 or 1 in stack
        for(k = 0; k<s; ++k){
            if(k == ver && i == gor)
                *(pNumField + i*s + k)=plId;
        }
    }
    
    for(i=0; i<s; ++i){ //show writen storage(mem. stack)
        for(k=0; k<s; ++k){
            cout    << *(pNumField + i*s + k) << ' ';           
        }
        cout << endl;
    }
}
Добавлено через 1 минуту
Всегда читайте и пытайтесь понять, что от Вас хочет компилятор, выдавая ошибки.
1
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 169
27.06.2014, 15:00  [ТС] #17
Указатель на указатель и динаммичесский массив. это пока еще слишком круто, я тольк овчера прочитал материал по этой теме. Сейчас надо взять и досконально разобраться с указателями на статичесский массив. ПОтом переписать программу с перечадей массива без указателя., потом переписать с передачей указателя на динамичесский массив. потом еще чтото придумаю.)

Кирил, у меня такой вопрос. с Чего начать/подойти.... как правильно искать ошибки в программе или понять что требует копилятор? Например я читаю и понимаю что он выдает н окак исправить... МОжнт можно как шаг за шагом смотреть за выполнением программы строчка за строчкой, символ за символом... чтоб понять где логика или синтаксис начинают давать сбой?!

Добавлено через 15 минут
Непонятно почему
C++
1
 *(pNumField + i*s + k)=plId;
инициализация двумерного массива представляеться в виде
int Arr[2][5]= {{1,2}, {3,8}, {3,5}, {8,1}, {6,4}}...

тоесть это строки. 5 строк(как отдельные блоки можно себе представить) и в каждой строке по 2 эллемента(строчки из 2 ячеек памяти.)

в нашем выражении i это счетчик в высоту массива(нумерует количество или порядок СТРОЧКИ массива). и k это счетчик которые задает длинну эллемента массива(можно сказать считает горизонтально, положение елемента в массиве) вот пример:
int Arr[2][5]=
{

{i=0, к=0: тут значение 1, i=0, к=1: тут значение 2},
{i=1, к=0: тут значение 3, i=1, к=1: тут значение 8},
{i=2, к=0: тут значение 3, i=2, к=1: тут значение 5},
{i=3, к=0: тут значение 8, i=3, к=1: тут значение 1},
{i=4, к=0: тут значение 6, i=4, к=1: тут значение 4}

}...

...+ k это какойт опереключатель? на пальцах.... не могу понять...
0
aleks_tar
2 / 2 / 0
Регистрация: 19.06.2014
Сообщений: 17
27.06.2014, 16:36 #18
MMt, двумерные массивы в памяти записываются строка за строкой, то есть все элементы таких массивов хранятся друг за другом. Например, если у нас есть массив array[2][2] = {{1, 2}, {3, 4}}, то в памяти элементы этого массива будут храниться в таком виде [1][2][3][4].

(pNumField + i*s + k) - это формула, по которой рассчитывается положение в памяти определённого элемента, то есть указатель на элемент array[i][k], pNumField - указатель на массив (то есть на него начало), а s - количество строк. А *(звёздочка) - это операция разименования указтеля, то есть получения значения, которое хранится в ячейке памяти, куда указывает указатель.
1
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 169
27.06.2014, 17:08  [ТС] #19
MMt, двумерные массивы в памяти записываются строка за строкой, то есть все элементы таких массивов хранятся друг за другом. - понятно.

Например, если у нас есть массив array[2][2] = {{1, 2}, {3, 4}}, то в памяти элементы этого массива будут храниться в таком виде [1][2][3][4]. - понятно

(pNumField + i*s + k) - это формула, по которой рассчитывается положение в памяти определённого элемента - понятно.

то есть указатель на элемент array[i][k] - НЕ ПОНЯТЕН СМЫСЛ ЭТОЙ ФРАЗЫ.

pNumField - указатель на массив (то есть на него начало), а s - количество строк.- понятно

А *(звёздочка) - это опsрация разыменования указтеля, то есть получения значения, которое хранится в ячейке памяти, куда указывает указатель. - понятно.


вот еще такой момент (pNumField + i*s + k) тут имееться в иду умножить? или * ставиться как указатель на чтото...?

Добавлено через 15 секунд
блин как туго идет)

Добавлено через 7 минут
я не пойму какая переенная что счелкает.... массив это матрица(квадрат прямоугольник, прямая с равнымыми частями...)

01. 02. 03. 04. строка это в длинну.
05. 06. 07. 08. столбец это в высоту.
09. 10. 11. 12.


или так выразить можно (01, 02, 03, 04)(05, 06, 07, 08)(09, 10, 11, 12)

какая переменная как переключает доступ к ячейке....
0
aleks_tar
2 / 2 / 0
Регистрация: 19.06.2014
Сообщений: 17
27.06.2014, 17:26 #20
Цитата Сообщение от MMt Посмотреть сообщение
вот еще такой момент (pNumField + i*s + k) тут имееться в иду умножить? или * ставиться как указатель на чтото...?
здесь i * s - это умножение
Цитата Сообщение от MMt Посмотреть сообщение
то есть указатель на элемент array[i][k] - НЕ ПОНЯТЕН СМЫСЛ ЭТОЙ ФРАЗЫ
если вывести на экран результат вот этой формулы (pNumField + i*s + k) - это будет адрес элемента i x k, то есть если взять пример твоего массива
Цитата Сообщение от MMt Посмотреть сообщение
01. 02. 03. 04. строка это в длинну.
05. 06. 07. 08. столбец это в высоту.
09. 10. 11. 12.
и в этой формуле подставить вместо i = 2, k = 1, а s будет равен количеству строк в массиве, то есть s = 3, то (pNumField + i * s + k) = (pNumField + 2 * 3 + 1) - будет указывать на элемент 07, а *(pNumField + 2 * 3 + 1) (разыменование этого указателя) будет равно 7, то есть i - это строка, а k - это столбец. Только надо учесть, что в C++ элементы считаются начиная с 0, а не с 1, как это делается в алгебре.
0
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 169
27.06.2014, 17:35  [ТС] #21
Добавлено через 7 минут
я не пойму какая переенная что счелкает.... массив это матрица(квадрат прямоугольник, прямая с равнымыми частями...)

01. 02. 03. 04. строка это в длинну.
05. 06. 07. 08. столбец это в высоту.
09. 10. 11. 12.


или так выразить можно (01, 02, 03, 04)(05, 06, 07, 08)(09, 10, 11, 12)

какая переменная как переключает доступ к ячейке....




Глупый вопрос. - разобрался. Прежде чем задавать его стоило сперва самому подумать как бы я написал уравнение где надо найти положение чейки в строке, зная 2 числа.

Арр[0][0] - имя массива или нулевая ячейка.
Чтоб попсть в нужную ячейку из этого массива, по правилам обращения к ячейкам массива мне надо к к 0.0. координатам добавить число на котоое я хочу сместиться. Например я хочу попасть в 7 ячейку.

7 ячейка это Арр c индексом [2][1]. У меня двехмерный массив App[3][3].

формула по которой можно попасть в 7 ячейку
0.0.(адрес первой ячейки или нулевой!) + 3(количество ячеек в 1 строке)*Х(это строка в которой у меня находиться нужная мне ячейка) + У(это порядок нужной мне ячейки по отношению к началу строки к которой она находиться)

с первого взгялда запутанно, но когда сам пробуешь написать все эллементарно. С положением нужных ячеек разобрался! Алекс и Киррил - спасибо Вас огромное.

Туперь в коде очередная ошибка. с диапазоном записываемх значений. Мне нужно в ячейку записат ьчисло -1 или +1. Если я записываю 1, то все нормально, а -1 не пишет...
0
Kerry_Jr
Модератор
Эксперт PHP
2203 / 1999 / 700
Регистрация: 14.05.2014
Сообщений: 5,861
Записей в блоге: 1
Завершенные тесты: 5
27.06.2014, 20:15 #22
А как -1 подставляете?

Добавлено через 3 минуты
Я так понимаю, Вы хотите "крестики - нолики" написать?
0
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 169
27.06.2014, 20:33  [ТС] #23
угу) крестики нолики. с минусом разобрался, функция не видела идентификатор игрока.
сут ьв чем:
Игрок 1 Id=1;
игрок 2 Id=2;

потом функция отрисовки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int fNumField(int *pNumField, int s, int playID, int ver, int gor){
    system("cls"); // î÷èñòêГ* ГЄГ®Г*ñîëè.
    
    int plId=0;
        
    if(playID == 1) // îïðåäåëåГ*ГЁГҐ 1 èëè -1 Г§Г*ïèñûâГ*ГІГј Гў ÿ÷åéêó.
        plId = -1;
    
    
    
    if(playID == 2) // îïðåäåëåГ*ГЁГҐ 1 èëè -1 Г§Г*ïèñûâГ*ГІГј Гў ÿ÷åéêó.
        plId = 1;
    
    for(int i=0; i<3; ++i){// write -1 or 1 in stack
        for(int k=0; k<3; ++k){
            if((i == ver) && (k == gor))
                *(pNumField+i*s+k)=plId;
        }   
    }
    
    for(int i=0; i<3; ++i){ //show writen storage(mem. stack)
        for(int k=0; k<3; ++k){
            cout    << *(pNumField+i*s+k) <<' ';            
        }
        cout    <<endl;
    }
    
    
    return *(pNumField), playID;
}
если Айди1 то ставим -1 если 2 тов ставим +1. это нао для определения победителя. ПОбедителя бду определять по такому алгоритму - где быстрее сумма строк собереться +3 или -1 там и будет победитель 1 или 2 игрок. Инчае ничья.

Добавлено через 1 минуту
сейчас ошибка не с знчением в ячейке а с заполнением игровог ополя. Функция отрисовки заполняет только ячейку с координатами 0.0. хотя в формуле неот ошибки в заполнении нет ошибки... может в выводе - проверяю.

Добавлено через 7 минут
145-149 строки гдето тут логичесская ошибка
0
Kerry_Jr
Модератор
Эксперт PHP
2203 / 1999 / 700
Регистрация: 14.05.2014
Сообщений: 5,861
Записей в блоге: 1
Завершенные тесты: 5
27.06.2014, 20:55 #24
Вы снова повторяете свою ошибку.
Цитата Сообщение от MMt Посмотреть сообщение
return *(pNumField), playID;
Во-первых, функция может вернуть только одно значение
Цитата Сообщение от MMt Посмотреть сообщение
int fNumField(int *pNumField, int s, int playID, int ver, int gor)
Во-вторых, Вам никакие значения не нужно возвращать, т.к. при вызове функции Вы не присваиваете ее значение никакой переменной.
0
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 169
27.06.2014, 21:43  [ТС] #25
Кирил у меня вопрос. по возврату.
в каком случае мне надо возвращать значения?
возвращают некоторое значение если внутри функции была создана некая новая переменная которая нигде раньше не оглашалась? чтоб остальной код мог "знать" откуда и что это за переменная...

Добавлено через 45 минут
нашел ошибку. я не правильно использую функцию. слишком сложное принципиально написание. мне достаточно в функцию передать координаты и выкинуть значение только 1 ячейки памяти из массива. не надо ничего выводить и так дале... над опереписать.
0
27.06.2014, 21:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2014, 21:43
Привет! Вот еще темы с ответами:

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

Где в памяти хранится тип указателя? - C++
Привет! Вы не подскажите, где в памяти храниться тип указателя? Ну допустим, у нас x86 и указатель занимает 4 байта, но эти 4-е байта -...

Двумерный массив. Где ошибка? - C++
Дана действительная квадратная матрица порядка N (N – нечетное), заполненная случайными числами, все элементы различны. Найти наибольший...

Двумерный массив, где ошибка? - C++
Здравствуйте! Странная вещь получается, вроде все делаю правильно, пытался вывести двумерный массив, а оно ошибку выдает на...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

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