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

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

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

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

27.06.2014, 12:48. Просмотров 614. Ответов 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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kerry_Jr
Модератор
Эксперт PHP
2192 / 1988 / 696
Регистрация: 14.05.2014
Сообщений: 5,822
Записей в блоге: 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){
А здесь та же операция перед объявлением. Очень странно это все выглядит.
0
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 169
27.06.2014, 13:02  [ТС] #3
стрнно про [B] не знаю откуда они взялись...
Где ошибка в передаче  указателя на массив?

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

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

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

C++
1
pNumField = &NumField
0
Kerry_Jr
Модератор
Эксперт PHP
2192 / 1988 / 696
Регистрация: 14.05.2014
Сообщений: 5,822
Записей в блоге: 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);
}
Хотя подождите! Я не обратил внимание, что Вы хотите вернуть три значения из функции.
1
MMt
0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 169
27.06.2014, 14:09  [ТС] #14
Работает, только пока не все понятно. Надо Грызть гранит науки)
не совсем понятна 85 и 91 строки, точнее первый раз вжу такую форму записи. Кири спасибо. Сейчас постараюсь разобраться.
0
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;
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2014, 14:19
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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