Top.Mail.Ru
Ответы

Как правильно присвоить строку двойному массиву СИ. Спасибо! Вопрос внутри

Простите туплю, уже поздний вечер. Так вот, так как на фото выдает ошибку. Компилятор визжит. А как можно? Только через копировальные функции?

И дополнительный вопрос, для любознательных. У меня эта функция будет как хранилище, она должна возвращать этот двойной массив и сохранять в указатель. Так как на фото так хорошо делать? Или есть еще варианты? Я думал может структуру создать, но как я понял в структурах нельзя записывать сразу данные

Дополнен

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

По дате
По рейтингу
Аватар пользователя
Новичок
5лет

#include <stdio.h>
#include <stdlib.h>
#define ROWS 19
#define COLS 16
char* get_line(int index) {
static char box[ROWS][COLS] = {
{ '#', '.', '.', '.', '#', '.', '.', '.', '#', '.', '.', '.', '#', '.', '.', '.' },
{ '#', '#', '#', '#', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
{ '.', '#', '.', '.', '#', '#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.' },
{ '.', '#', '.', '.', '#', '#', '#', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
{ '#', '.', '.', '.', '#', '#', '.', '.', '#', '.', '.', '.', '.', '.', '.', '.' },
{ '#', '#', '#', '.', '.', '#', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
{ '#', '#', '.', '.', '#', '#', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
{ '.', '#', '.', '.', '.', '#', '.', '.', '#', '#', '.', '.', '.', '.', '.', '.' },
{ '.', '.', '#', '.', '#', '#', '#', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
{ '#', '#', '.', '.', '#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.', '.' },
{ '#', '.', '.', '.', '#', '#', '#', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
{ '#', '.', '.', '.', '#', '.', '.', '.', '#', '#', '.', '.', '.', '.', '.', '.' },
{ '.', '#', '.', '.', '#', '#', '.', '.', '#', '.', '.', '.', '.', '.', '.', '.' },
{ '.', '#', '#', '.', '#', '#', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
{ '#', '.', '.', '.', '#', '#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.' },
{ '#', '#', '.', '.', '.', '#', '#', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
{ '#', '#', '#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
{ '#', '#', '#', '.', '#', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
{ '#', '#', '.', '.', '.', '#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.' }
};
return box[index];
}
int main(void) {
char** box = (char*)malloc(ROWS * sizeof(char*));
int i, j;
for (i = 0; i < ROWS; ++i) box[i] = get_line(i);
for (i = 0; i < ROWS; ++i) {
for (j = 0; j < COLS; ++j) putchar(box[i][j]);
putchar('\n');
}
free(box);
getchar();
return 0;
}

Аватар пользователя
Мыслитель
5лет

По поводу функции char **get_arr() не прокатит. Нужно читать время жизни переменной. В данном случае вы создаете массив в функции. Потом при выходе из функции массив уничтожается (он конечно не сразу удалит данные в нем, но к этому массиву уже не стоит обращаться так как другие переменные будут создаваться именно в месте где был массив) и вы возвращаете из функции указатель на массив, который удалится при выходе из функции.

char **arrayOfChar = get_arr();
int x = 10; // вот эта переменная наверняка уже попортит массив созданный в функции, нужно копаться и проверять, но я всего лишь к тому что так не делается
Можно попробовать использовать ключевое слово static(я на С++ учился и не знаю есть ли оно в С)

static char ttrs[19][16] = {
"#...#...#...#...",
"####....",
...,
...
};
return ttrs; // В таком случае возможно прокатит.

strcpy - именно через эту функцию и нужно либо в цикле ручками имитируя функцию strcpy.

В комментах допишу ответ, так как все еще не прокатывает даже со static.

Аватар пользователя
Мастер
5лет

"сразу" записывать данные в структуры можно. это называется инициализацией. только надо, естественно, создать экземпляр структуры сначала.

для текущей же задачи можно создать ВНЕШНЮЮ переменную (т. е. объявить ее вне функций). и инициализировать ее. как уже в другом ответе:

char ttrs[19][16] = {
"#...#...#...#...",
"####....",
...,
...
};

только надо принять во внимание, что литералы в двойных кавычках включают в себя завершающий строку нулевой элемент, а значит для их хранения длина массива должна быть не 16, а 17.

и перестань уже возвращать ссылки на локальные переменные в функции. ОНИ УНИЧТОЖАЮТСЯ, указатель по возвращении из функции будет указывать в освобожденную память!

Аватар пользователя
Оракул
5лет

Попробуй заменить тип на char* ttrs[16].
UPD: это тоже не поможет, т. к. тебе придётся возвращать этот массив из функции, а он живёт только до конца функции, а потом возвращаемый указатель будет указывать на невыделенную область памяти, т. е. ниже конца стека. Можешь выделять его на куче через malloc (или new, если речь о плюсах), но тогда придётся следить за своевременным освобождением памяти.

Я не очень понимаю, что такое "хранилище", но если это какие-то константные строчки типа шаблонов тетрамино, то их проще сохранить в глобальных переменных и инициализировать в main-е. А то у тебя на каждый вызов будет копия создаваться.

Аватар пользователя
Оракул
5лет

Если ты решил валидировать тетраминки прост сравнив их со всеми возможными... то это так себе.
Посчитать количество соседей круче ))