Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 7

Работа с одномерными и двумерными массивами

19.02.2019, 14:45. Показов 1394. Ответов 10

Студворк — интернет-сервис помощи студентам
Не понимаю почему так происходит.
В 1 блоке в одномерный массив Landscape03Vtx_1 записываются значения из двумерного массива y[][].
И с Landscape03Idx_1 и r[][] аналогично. Одновременно эти значения записываются в txt файл. (тут ни каких ошибок нет, выводит как и должно).

toch1.txt:
-13.226, -9.78958, 19,
-13.226, -9.78958, 0,
11.774, -9.78958, 0,
11.774, -9.78958, 19,
11.774, 10.2104, 19,
-13.226, 10.2104, 0,
-13.226, 10.2104, 19,
11.774, 10.2104, 0,

face1.txt:
2 1 3
1 4 3
4 5 3
5 8 3
8 5 6
5 7 6
2 6 1
6 7 1
4 1 5
1 7 5
3 8 2
2 8 6


Сразу после этого, во 2 блоке (между ними ни каких операций нет), снова проделывается операция записи одномерных массивов в tet файлы. Вот тут уже возникают ошибки, которые я не понимаю из за чего, при чем меняются не все значения, а только некоторые и только в одном файле. Подскажите в чем проблема.

toch1.txt:
-13.226, 1.6976e-313, 6.95344e-309,
4.17218e-309, 6.95348e-309, 8.34407e-309,
1.39082e-309, 1.39078e-309, 1.11254e-308,
8.3442e-309, -9.78958, 19,
11.774, 10.2104, 19,
-13.226, 10.2104, 0,
-13.226, 10.2104, 19,
11.774, 10.2104, 0,

face1.txt:
2 1 3
1 4 3
4 5 3
5 8 3
8 5 6
5 7 6
2 6 1
6 7 1
4 1 5
1 7 5
3 8 2
2 8 6


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
int x = 0; //количество вершин точек сетки
int e = 0; //количество граней сетки
double **y; //массив координат точек
double **r; //массив граней сетки
 
btScalar Landscape03Vtx_1[] = { 0, };
unsigned short Landscape03Idx_1[] = { 0, };
int LandscapeVtxCount_1[] = { 0, };
int LandscapeIdxCount_1[] = { 0, };
btScalar* LandscapeVtx_1[] = { 0, };
unsigned short* LandscapeIdx_1[] = { 0, };
 
//1 Блок
 
int oh1 = 0;
    ofstream toch("D:\\new\\Visualc1\\Cube\\Mesh\\toch1.txt");
    for (int i1 = 0; i1 < x; i1++)
    {
        Landscape03Vtx_1[oh1] = y[i1][1];
        toch << Landscape03Vtx_1[oh1] << " ";
        oh1 = oh1 + 1;
 
        Landscape03Vtx_1[oh1] = y[i1][2];
        toch << Landscape03Vtx_1[oh1] << " ";
        oh1 = oh1 + 1;
 
        Landscape03Vtx_1[oh1] = y[i1][3];
        toch << Landscape03Vtx_1[oh1] << " ";
        oh1 = oh1 + 1;
 
        toch << endl;
    }
 
 
int oh = 0;
    ofstream face("D:\\new\\Visualc1\\Cube\\Mesh\\face1.txt");
    for (int i = 0; i < e; i++)
    {
        Landscape03Idx_1[oh] = r[i][1];
        face << Landscape03Idx_1[oh] << " ";
        oh = oh + 1;
 
        Landscape03Idx_1[oh] = r[i][2];
        face << Landscape03Idx_1[oh] << " ";
        oh = oh + 1;
 
        Landscape03Idx_1[oh] = r[i][3];
        face << Landscape03Idx_1[oh] << " ";
        oh = oh + 1;
 
        face << endl;
    }
 
 
//2 Блок
    ofstream f1231("D:\\new\\Visualc1\\Cube\\Mesh\\toch.txt");
    f1231 << x << endl;
    for (int i = 0; i < x * 3; i++)
    {
        f1231 << Landscape03Vtx_1[i] << " " << Landscape03Vtx_1[i + 1] << " " << Landscape03Vtx_1[i + 2] << endl;
        i = i + 2;
    }
 
    ofstream f12312("D:\\new\\Visualc1\\Cube\\Mesh\\face.txt");
    f12312 << e << endl;
    for (int i = 0; i < e * 3; i++)
    {
        f12312 << Landscape03Idx_1[i] << " " << Landscape03Idx_1[i + 1] << " " << Landscape03Idx_1[i + 2] << endl;
        i = i + 2;
    }


А если между 1 и 2 блоком еще добавить необходимые для программы строки, то и во втором файле значения тоже изменяться.

C++
1
2
3
4
5
6
7
    LandscapeVtxCount_1[0] = { x, };
 
    LandscapeIdxCount_1[0] = { e, };
 
    LandscapeVtx_1[0] = { Landscape03Vtx_1, };
 
    LandscapeIdx_1[0] = { Landscape03Idx_1, };
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.02.2019, 14:45
Ответы с готовыми решениями:

Указатели при работе с одномерными и двумерными массивами
Помогите Даны натуральное число n, целые числа а1,...,аn . Выяснить, имеется ли среди чисел а1,...,аn совпадающие.

Использование указателей при работе с одномерными и двумерными массивами
Даны натуральное число n, действительные числа A1......An . Если в последовательности A1.....An есть хотя бы один член, меньший, чем -3,...

Использование указателей при работе с одномерными и двумерными массивами
Даны натуральное число n, действительные числа a1, ..., an. Преобразовать последова-тельность a1, ..., a2n, расположив вначале...

10
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
20.02.2019, 04:57
а если так
C++
1
2
3
4
for (int i = 0; i < x * 3; i+=3)
{    
        f1231 << Landscape03Vtx_1[i] << " " << Landscape03Vtx_1[i + 1] << " " << Landscape03Vtx_1[i + 2] << endl;
}
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 7
20.02.2019, 08:00  [ТС]
Нет, так же остается.
Тут проблема не в записи в txt файл (txt файлы созданы только для проверки значений), значения одномерного массива почему то меняются сразу после записи в них значений из двумерного.
Я бы может понимал в чем ошибка, если бы менялись все значения, но меняются примерно только половина, остальные остаются такими какими должны быть. (не важно какой размерности двумерные массивы, всегда меняется примерно половина)
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
20.02.2019, 08:11
Цитата Сообщение от NikSis Посмотреть сообщение
int LandscapeVtxCount_1[] = { 0, };
Это что за синтаксис такой { 0, }, о чем говорит запятая в конце списка инициализации?
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 7
20.02.2019, 08:16  [ТС]
По большому счету запятая ничего не делает. И убрав ее, результат не измениться (только что проверил)
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
20.02.2019, 08:21
Может я чего не понимаю, но x и e у вас инициализированы нулями.
Массивы объявляются из одного элемента
Цитата Сообщение от NikSis Посмотреть сообщение
oh = oh + 1;
Ну что это такое? вы про инкрементный оператор слышали?
Не код, а каша, ни чего не пойму.

Добавлено через 2 минуты
Цитата Сообщение от NikSis Посмотреть сообщение
По большому счету запятая ничего не делает. И убрав ее, результат не измениться (только что проверил)
Ну тогда вы создаете массив на один элемент, как это вообще у вас работает?

Добавлено через 2 минуты
Я так понимаю, что вы кусочками выдрали из контекста и хотите чтоб мы нашли ошибку в коде, в котором вы сами разобраться не можете
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 7
20.02.2019, 08:27  [ТС]
Это не полный код. Полный код здесь будет на несколько страниц. x и e первоночально объявлены 0, согласен, но в последствие принимают значения. Если так важен код этого присвоения, то вот (В первом сообщение было ведь написано, что значения в первые txt файлы записываются нормально)

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
//чтение вершин точек из .node файла
    ifstream toc("D:\\new\\Visualc1\\Cube\\Mesh\\example.1.node");
    if (toc.is_open())
    {
        char symbol;
 
        while (symbol != ' ')
        {
            toc >> x;
            break;
        }
        y = new double*[x + 1];
        for (int i = 0; i < x + 1; i++) y[i] = new double[4];
 
        toc.seekg(0, ios::beg);
        toc.clear();
 
        for (int i = 0; i < x + 1; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                toc >> y[i][j];
            }
 
        }
        toc.close();
    }
 
    //чтение граней из .face файла
    ifstream gra("D:\\new\\Visualc1\\Cube\\Mesh\\example.1.face");
    if (gra.is_open())
    {
        char symbol;
 
        while (symbol != ' ')
        {
            gra >> e;
            break;
        }
 
        while (symbol != ' ')
        {
            gra >> c1;
            break;
        }
        r = new double*[e];
        for (int i = 0; i < e; i++) r[i] = new double[5];
 
        for (int i = 0; i < e; i++)
        {
            for (int j = 0; j < 5; j++)
            {
                gra >> r[i][j];
            }
        }
        gra.close();
    }
"вы про инкрементный оператор слышали?" - нет не слышал.
"Не код, а каша, ни чего не пойму." - а я и не говорю что я супер программист, как умею так пишу.

Добавлено через 3 минуты
Вся проблема вопроса заключается в изменении значений массива. Я выбрал первоночально тот кусок кода в котором эта проблема и стоит. Вся другая часть кода к этим массивам ни какого значения не имеет, ни как не меняет их и не использует.
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
20.02.2019, 08:59
Цитата Сообщение от NikSis Посмотреть сообщение
а я и не говорю что я супер программист, как умею так пишу
Я на вас не наезжаю Извините, если не так выразился, я просто хотел сказать, что мне из вашего кода вообще ни чего не понятно.

Добавлено через 4 минуты
Цитата Сообщение от NikSis Посмотреть сообщение
изменении значений массива
Я вижу массивы из одного элемента, с которыми вы работаете как с множеством элементов

Добавлено через 1 минуту
Цитата Сообщение от NikSis Посмотреть сообщение
int LandscapeVtxCount_1[] = { 0, };
вот такая строчка инициализирует массив с одним элементом, и строчка LandscapeVtxCount_1[1] = 1 должна выдавать ошибку

Добавлено через 1 минуту
Цитата Сообщение от NikSis Посмотреть сообщение
"вы про инкрементный оператор слышали?" - нет не слышал.
Вы его используете далее в коде:
Цитата Сообщение от NikSis Посмотреть сообщение
for (int i1 = 0; i1 < x; i1++)
вот он ++

Добавлено через 4 минуты
далее блок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
        Landscape03Vtx_1[oh1] = y[i1][1];
        toch << Landscape03Vtx_1[oh1] << " ";
        oh1 = oh1 + 1;
 
        Landscape03Vtx_1[oh1] = y[i1][2];
        toch << Landscape03Vtx_1[oh1] << " ";
        oh1 = oh1 + 1;
 
        Landscape03Vtx_1[oh1] = y[i1][3];
        toch << Landscape03Vtx_1[oh1] << " ";
        oh1 = oh1 + 1;
 
        toch << endl;
    }
Почему у вас второй индекс массива y начинается не с нуля?

Добавлено через 7 минут
Я бы этот блок написал так:
C++
1
2
3
4
5
6
7
for (int i = 0; i < x; i++){
    for (int j = 0; j < m; j++) {
        Landscape03Vtx_1[m * i + j] = y[i][j];
        toch << Landscape03Vtx_1[m * i + j] << " ";
    }
    toch << endl;
}
Обратите внимание на m * i + j, нужно писать так, если вы хотите заполнять массив, а не перезаписывать, как у вас тут ошибся, у вас не перезапись, т.к. oh1 вынесена из цикла, но все равно, так компактнее и удобнее читать
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 7
20.02.2019, 09:03  [ТС]
x фиксированное число в данном случае оно равно 8. Получиться что он заполняет

C++
1
2
3
4
5
6
7
for (int i = 0; i < x; i++){
    for (int j = 0; j < 3; j++) {
        Landscape03Vtx_1[x * i + j] = y[i][j];
        toch << Landscape03Vtx_1[x * i + j] << " ";
    }
    toch << endl;
}
ячейки ([x * i + j]) 0, 1, 2, 8 (8*1+0), 9 (8*1+1), 10 (8*1+2), 16 (8*2+0) и тд
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
20.02.2019, 09:11
я ошибся слегка, и ошибку свою исправил, нужно умножать не на x а на кол-во элементов в строке

Добавлено через 1 минуту
Просто код пишу прям здесь, поторопился
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
20.02.2019, 16:54
NikSis, можете ответить на вопрос Avaddon74
Цитата Сообщение от Avaddon74 Посмотреть сообщение
Почему у вас второй индекс массива y начинается не с нуля?
строка 19 кода из Вашего первого сообщения
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.02.2019, 16:54
Помогаю со студенческими работами здесь

Использование указателей при работе с одномерными и двумерными массивами.
Кто может решить. Даны натуральное число n,действительные числа X1,...,Xn.Вычислить: (X1+X2+2Xn)(X2+X3+2Xn-1)...(Xn-1+Xn+X2) Язык...

Работа с одномерными массивами
Может кто-то сможет помочь .. В одномерном массиве ,который состоит из 15 действительных элементов вычислить : 1)Максимальный элемент...

Работа с одномерными массивами
1) массивы должны быть динамические – организовать вы-деление памяти; 2) значения элементов массива вводятся с клавиатуры; 3) каждый...

Работа с одномерными массивами
Если в массиве отсутствуют нули, найти произведение его элементов. Затем циклически сдвинуть четные элементы вправо на две позиции, заменив...

Работа с одномерными массивами
1) Сформировать массив из n элементов с помощью датчика случайных чисел (n задается пользователем с клавиатуры). 2) Распечатать...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru