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

ну окей из всех пока перечисленных коментаривет я понял что только через копировальные функции strcpy как вариант, оно та работает просто думал есть проще вариант. А как насчет хранилища?
#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;
}
По поводу функции char **get_arr() не прокатит. Нужно читать время жизни переменной. В данном случае вы создаете массив в функции. Потом при выходе из функции массив уничтожается (он конечно не сразу удалит данные в нем, но к этому массиву уже не стоит обращаться так как другие переменные будут создаваться именно в месте где был массив) и вы возвращаете из функции указатель на массив, который удалится при выходе из функции.
char **arrayOfChar = get_arr();
int x = 10; // вот эта переменная наверняка уже попортит массив созданный в функции, нужно копаться и проверять, но я всего лишь к тому что так не делается
Можно попробовать использовать ключевое слово static(я на С++ учился и не знаю есть ли оно в С)
static char ttrs[19][16] = {
"#...#...#...#...",
"####....",
...,
...
};
return ttrs; // В таком случае возможно прокатит.
strcpy - именно через эту функцию и нужно либо в цикле ручками имитируя функцию strcpy.
В комментах допишу ответ, так как все еще не прокатывает даже со static.
"сразу" записывать данные в структуры можно. это называется инициализацией. только надо, естественно, создать экземпляр структуры сначала.
для текущей же задачи можно создать ВНЕШНЮЮ переменную (т. е. объявить ее вне функций). и инициализировать ее. как уже в другом ответе:
char ttrs[19][16] = {
"#...#...#...#...",
"####....",
...,
...
};
только надо принять во внимание, что литералы в двойных кавычках включают в себя завершающий строку нулевой элемент, а значит для их хранения длина массива должна быть не 16, а 17.
и перестань уже возвращать ссылки на локальные переменные в функции. ОНИ УНИЧТОЖАЮТСЯ, указатель по возвращении из функции будет указывать в освобожденную память!
Попробуй заменить тип на char* ttrs[16].
UPD: это тоже не поможет, т. к. тебе придётся возвращать этот массив из функции, а он живёт только до конца функции, а потом возвращаемый указатель будет указывать на невыделенную область памяти, т. е. ниже конца стека. Можешь выделять его на куче через malloc (или new, если речь о плюсах), но тогда придётся следить за своевременным освобождением памяти.
Я не очень понимаю, что такое "хранилище", но если это какие-то константные строчки типа шаблонов тетрамино, то их проще сохранить в глобальных переменных и инициализировать в main-е. А то у тебя на каждый вызов будет копия создаваться.
Если ты решил валидировать тетраминки прост сравнив их со всеми возможными... то это так себе.
Посчитать количество соседей круче ))