#c #arrays
#c #массивы
Вопрос:
Я создал следующую функцию:
int * getMat(char x){
int[2][2] returnValue;
switch(x){
case "0": returnValue = [0,0;0,0];
break;
case "1": returnValue = [1,1;1,0];
break;
....
etc
}
return returnValue;
}
В основной функции у меня есть эти векторы:
char a[] = "010110"
int bigArray[100][2];
Мне нужно заполнить bigArray[][], повторяя каждый символ из a[] и добавляя возвращаемый массив из getMat() в bigArray .
Другими словами, для последовательности символов «010110» большой массив должен выглядеть так:
[0,0,1,1,0,0,1,1,1,1,0,0;
0,0,1,0,0,0,1,0,1,0,0,0]
Я застрял на этом:
int bigArray[100][2];
for(int i=0; i<strlen(a); i ){
int mat[2][2] = getMat(a[i]);
}
Может кто-нибудь помочь мне с некоторыми советами? Я не могу понять, как поступить.
Комментарии:
1.
getMat
C
не является ниC
2. Как же так? Я новичок в C / C
3. Вы пробовали компилировать свою
getMat()
функцию? Сигнатура функции уже не должна компилироваться.4. Извините, я не компилировал его, пока записываю, пытаясь понять, как это сделать.
5. @BLUEPIXY Я инициализировал bigArray[2] [100], поскольку это будет его максимальный размер, есть ли проблема?
Ответ №1:
#include <stdio.h>
#include <string.h>
int (*getMat(char x))[2][2] {
static int returnValue[][2][2] = {
{{0,0},{0,0}},
{{1,1},{1,0}},
//...
};
switch(x){
case '0':
return amp;returnValue[0];
case '1':
return amp;returnValue[1];
//....
//etc
}
return NULL;
}
int main(void){
char a[] = "010110";
int bigArray[2][100];
int (*tmp)[2][2];
for(int i=0;a[i]; i){
tmp = getMat(a[i]);
memcpy(amp;bigArray[0][i*2], amp;(*tmp)[0], sizeof((*tmp)[0]));
memcpy(amp;bigArray[1][i*2], amp;(*tmp)[1], sizeof((*tmp)[1]));
}
//test print
for(int i=0;i<12; i)
printf("%d ", bigArray[0][i]);//0 0 1 1 0 0 1 1 1 1 0 0
printf("n");
for(int i=0;i<12; i)
printf("%d ", bigArray[1][i]);//0 0 1 0 0 0 1 0 1 0 0 0
printf("n");
return 0;
}
Комментарии:
1. Спасибо, ты спаситель жизни: D
Ответ №2:
Вы не можете возвращать массивы в C. Вместо этого, что вы могли бы сделать, это указать getMat
, куда он должен записывать свои выходные данные.
Например:
void make_big(char in, char *out_row1, char *out_row2)
{
char const *temp = "0000";
switch(in)
{
case 1: temp = "1110";
// etc.
}
out_row1[0] = temp[0];
out_row1[1] = temp[1];
out_row2[0] = temp[2];
out_row2[1] = temp[3];
}
// in main
char big[2][100 1] = { 0 }; // [rows][cols], and null terminator
for(int i=0; i<strlen(a) amp;amp; i < 50; i )
{
make_big(a[i], amp;big[0][i*2], amp;big[1][i*2]);
}
Если все ваши значения для ‘temp’ представимы строковыми литералами, то вы можете вернуть указатель на них и заставить вызывающую функцию выполнить логику позиционирования. Вы можете вернуть указатель на элемент массива, однако массив должен все еще существовать после возврата функции (т. Е. Он не может быть нестатической локальной переменной функции). Но это не сработало бы, если бы вам нужно было вычислять значения во время выполнения.