0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 185
1

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

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

Author24 — интернет-сервис помощи студентам
через указатель на массив хочу в массив записать значние -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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2014, 12:48
Ответы с готовыми решениями:

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

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

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

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

24
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
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){
А здесь та же операция перед объявлением. Очень странно это все выглядит.
0
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 185
27.06.2014, 13:02  [ТС] 3
стрнно про [B] не знаю откуда они взялись...
Где ошибка в передаче  указателя на массив?


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

Что означают **. Как называется операция или это действие? он мне назнакомо.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
27.06.2014, 13:04 4
Извиняюсь, вот так это выглядело у меня
Миниатюры
Где ошибка в передаче  указателя на массив?  
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
27.06.2014, 13:07 5
Цитата Сообщение от MMt Посмотреть сообщение
Что означают **. Как называется операция или это действие? он мне незнакомо.
Это указатель на указатель, используется для передачи двумерного массива в функцию, для динамического создания двумерного массива.
0
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 185
27.06.2014, 13:08  [ТС] 6
я вижу в коде тоже так написано.. все верно, вопрос откуда взялась эта [B]/// она есть в том коде тч оя опубликовал, но я туда ее не ставил.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
27.06.2014, 13:18 7
Скорее всего Вы пытались выделить жирным места, где возможна ошибка, но внутри тегов C++ теги B не работают.
0
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 185
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, это указатель на колличество столбцов в массиве. п.с. уже бред и не вяжеться. обьясните пож)
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
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
0
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 185
27.06.2014, 13:47  [ТС] 10
Почему?

Добавлено через 2 минуты
хорошо вопрос почему можно опустить....
Как павильно теперь записать обьявление функции, вызов и инициализацию...?
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
27.06.2014, 13:50 11
Цитата Сообщение от MMt Посмотреть сообщение
pNumField = &NumField[s][s];
Вы присваиваете указателю неизвестный адрес. Т.к. у Вас массив размерности 3х3, то у него не будет индексов с номером 3. И вопрос, а зачем Вам указатель на последний элемент массива?
0
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 185
27.06.2014, 14:02  [ТС] 12
незачем. это ошибка скорее всего.
Хорошо. Мне надо присвоить указателю адрес первого елемента массива... начинаю догонять)

C++
1
pNumField = &NumField
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
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);
}
Хотя подождите! Я не обратил внимание, что Вы хотите вернуть три значения из функции.
1
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 185
27.06.2014, 14:09  [ТС] 14
Работает, только пока не все понятно. Надо Грызть гранит науки)
не совсем понятна 85 и 91 строки, точнее первый раз вжу такую форму записи. Кири спасибо. Сейчас постараюсь разобраться.
0
2 / 2 / 2
Регистрация: 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;
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
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
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 185
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
2 / 2 / 2
Регистрация: 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
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 185
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
2 / 2 / 2
Регистрация: 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
27.06.2014, 17:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2014, 17:26
Помогаю со студенческими работами здесь

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

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

Функция требующая ссылку компилируется при передаче ей указателя
Такого я еще не видел.... проблемный участок кода находится на скрине... имеем указатель на CState...

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


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

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

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