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

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

Восстановить пароль Регистрация
 
 
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
27.06.2014, 12:48     Где ошибка в передаче указателя на массив? #1
через указатель на массив хочу в массив записать значние -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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1866 / 1662 / 579
Регистрация: 14.05.2014
Сообщений: 4,772
Записей в блоге: 1
Завершенные тесты: 5
27.06.2014, 12:57     Где ошибка в передаче указателя на массив? #2
Цитата Сообщение от MMt Посмотреть сообщение
int fNumField(int *pNumField, int s, int playID, int ver, int gor);
Что означают "В" и "/В"? Если Вы хотите передать указатель на двумерный массив, то это можно сделать так **pNumField.
Цитата Сообщение от MMt Посмотреть сообщение
fNumField(*pNumField, playID, ver, gor);//show new playfield
Здесь у Вас операция взятия индекса уже в имени функции, а не в параметрах.
Цитата Сообщение от MMt Посмотреть сообщение
int fNumField(int *pNumField, int s, int playID, int ver, int gor){
А здесь та же операция перед объявлением. Очень странно это все выглядит.
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
27.06.2014, 13:02  [ТС]     Где ошибка в передаче указателя на массив? #3
стрнно про [B] не знаю откуда они взялись...
Где ошибка в передаче  указателя на массив?

оно скопирвоалось но в DevC++ этих символов не видно.

Что означают **. Как называется операция или это действие? он мне назнакомо.
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1866 / 1662 / 579
Регистрация: 14.05.2014
Сообщений: 4,772
Записей в блоге: 1
Завершенные тесты: 5
27.06.2014, 13:04     Где ошибка в передаче указателя на массив? #4
Извиняюсь, вот так это выглядело у меня
Миниатюры
Где ошибка в передаче  указателя на массив?  
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1866 / 1662 / 579
Регистрация: 14.05.2014
Сообщений: 4,772
Записей в блоге: 1
Завершенные тесты: 5
27.06.2014, 13:07     Где ошибка в передаче указателя на массив? #5
Цитата Сообщение от MMt Посмотреть сообщение
Что означают **. Как называется операция или это действие? он мне незнакомо.
Это указатель на указатель, используется для передачи двумерного массива в функцию, для динамического создания двумерного массива.
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
27.06.2014, 13:08  [ТС]     Где ошибка в передаче указателя на массив? #6
я вижу в коде тоже так написано.. все верно, вопрос откуда взялась эта [B]/// она есть в том коде тч оя опубликовал, но я туда ее не ставил.
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1866 / 1662 / 579
Регистрация: 14.05.2014
Сообщений: 4,772
Записей в блоге: 1
Завершенные тесты: 5
27.06.2014, 13:18     Где ошибка в передаче указателя на массив? #7
Скорее всего Вы пытались выделить жирным места, где возможна ошибка, но внутри тегов C++ теги B не работают.
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
27.06.2014, 13:27  [ТС]     Где ошибка в передаче указателя на массив? #8
верно -пытался.
массив надо предать статичесский. Без создания динамичесского или создания масива указателей..
Сут ьв том чтоб понять всю кухню передачи статичесского двухмерного массива в функцию.

Что для этого надо сделать?
1) Обьявить функцию. Внутри обьявления функции сказать, что я передаю статичесский двухмерный массив.
Вот кк я это сделал:
C++
1
int fNumField(int *pNumField, int s, int playID, int ver, int gor);
Причем: (int *pNumField, int s,... Это указатель на первый эллемент двухмерно массива и s, это указатель на колличество столбцов в массиве. п.с. уже бред и не вяжеться. обьясните пож)
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1866 / 1662 / 579
Регистрация: 14.05.2014
Сообщений: 4,772
Записей в блоге: 1
Завершенные тесты: 5
27.06.2014, 13:43     Где ошибка в передаче указателя на массив? #9
Цитата Сообщение от MMt Посмотреть сообщение
fNumField(*pNumField, playID, ver, gor);//show new playfield
43 строка, при передаче указателя не нужно его разыменовывать.
C++
1
fNumField(pNumField, playID, ver, gor);//show new playfield
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
27.06.2014, 13:47  [ТС]     Где ошибка в передаче указателя на массив? #10
Почему?

Добавлено через 2 минуты
хорошо вопрос почему можно опустить....
Как павильно теперь записать обьявление функции, вызов и инициализацию...?
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1866 / 1662 / 579
Регистрация: 14.05.2014
Сообщений: 4,772
Записей в блоге: 1
Завершенные тесты: 5
27.06.2014, 13:50     Где ошибка в передаче указателя на массив? #11
Цитата Сообщение от MMt Посмотреть сообщение
pNumField = &NumField[s][s];
Вы присваиваете указателю неизвестный адрес. Т.к. у Вас массив размерности 3х3, то у него не будет индексов с номером 3. И вопрос, а зачем Вам указатель на последний элемент массива?
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
27.06.2014, 14:02  [ТС]     Где ошибка в передаче указателя на массив? #12
незачем. это ошибка скорее всего.
Хорошо. Мне надо присвоить указателю адрес первого елемента массива... начинаю догонять)

C++
1
pNumField = &NumField
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1866 / 1662 / 579
Регистрация: 14.05.2014
Сообщений: 4,772
Записей в блоге: 1
Завершенные тесты: 5
27.06.2014, 14:04     Где ошибка в передаче указателя на массив? #13
Проверяйте
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
96
#include <iostream>
#include <stdlib.h>
using namespace std;
 
int InputLocPl1(int gor, int ver, int playID);
int 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) Предложение ввести координаты. 
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(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=0, k=0;
    
    for(i; i<s; ++i){// write -1 or 1 in stack
        for(k; k<s; ++k){
            if(i == ver && k == 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;
    }
    return *(pNumField);
}
Хотя подождите! Я не обратил внимание, что Вы хотите вернуть три значения из функции.
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
27.06.2014, 14:09  [ТС]     Где ошибка в передаче указателя на массив? #14
Работает, только пока не все понятно. Надо Грызть гранит науки)
не совсем понятна 85 и 91 строки, точнее первый раз вжу такую форму записи. Кири спасибо. Сейчас постараюсь разобраться.
aleks_tar
2 / 2 / 0
Регистрация: 19.06.2014
Сообщений: 17
27.06.2014, 14:19     Где ошибка в передаче указателя на массив? #15
Можно передать указатель на указатель в функцию, но в таком случае нужно будет динамически создать массив (и потом его удалить).
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
// объявление функции 
int fNumField(int** pNumField, int s, int playID, int ver, int gor);
// ...
// много кода
// ...
int s = 3;
// создание динамического массива
int **pointer_to_NumField = new int*[s];
for(int i = 0; i < s; ++i)
{
    pointer_to_NumField[i] = new int[s];
}
//...
// много кода
//...
// вызов функции fNumField()
fNumField(pointer_to_NumField, playID,[/B] ver, gor);//show new playfield
// ...
// удаление динамического массива
for(int i = 0; i < s; ++i)
{
    delete[] pointer_to_NumField[i];
}
delete[] pointer_to_NumField;
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1866 / 1662 / 579
Регистрация: 14.05.2014
Сообщений: 4,772
Записей в блоге: 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 минуту
Всегда читайте и пытайтесь понять, что от Вас хочет компилятор, выдавая ошибки.
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
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 это какойт опереключатель? на пальцах.... не могу понять...
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 - количество строк. А *(звёздочка) - это операция разименования указтеля, то есть получения значения, которое хранится в ячейке памяти, куда указывает указатель.
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 168
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)

какая переменная как переключает доступ к ячейке....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2014, 17:26     Где ошибка в передаче указателя на массив?
Еще ссылки по теме:

Порча указателя при передаче в функцию C++
При передаче указателя в качестве аргумента функции теряется значение C++
C++ Ошибки преобразования при передаче указателя на функцию

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

Или воспользуйтесь поиском по форуму:
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, как это делается в алгебре.
Yandex
Объявления
27.06.2014, 17:26     Где ошибка в передаче указателя на массив?
Ответ Создать тему
Опции темы

Текущее время: 09:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru