Quel est l'équivalent en C pour inizialiser une gamme (constante) de tableaux d'entiers (de différentes dimensions)?
en JavaScript, c'est comme ceci: P>
myarray = [[[[1,2,3,4], [123,234], [1], [1,2]] P> blockQuote>
p>
int c1[]={1,2,3,4}; int c2[]={5,6}; int c3[]={2,3,4} int *arr[]={c1,c2,c3};
5 Réponses :
quel est l'équivalent en c ... em> La réponse courte est qu'il n'y a rien d'équivalent dans C pour faire ce que vous exposez dans Le moyen le plus courant de faire quelque chose similaire em> en C est d'utiliser une structure: p> c99 (et au-delà) Implements Membres de tableau flexibles em>. Ceci est similaire, mais encore une fois, pas exactement ce que vous voulez. (c'est-à-dire qu'il utilise également la construction JavaScript code>. P> struct code>.) p> p>
presque .. mais le tableau est énorme et les éléments ont toutes les tailles différentes ... une structure ne le coupera pas
@ZIBRI J'espère que vous n'êtes pas le bownvoter, car l'ajout d'une contrainte comme celle-ci dans un commentaire d'une réponse signifie que votre question n'était pas complète. Dans ce cas, je dirais que c'est la question b> qui mérite le bowvote.
@Andrewhenle - Je ne pense pas que Zibi a voté. Le vote en direct s'est bien passé après avoir commenté. Cela peut-être juste être un vote à la baisse compétitive. Merci de sauter dans :)
Il n'y a pas de moyen facile de le faire et cela dépend si vous savez exactement votre contribution.
Ce que j'ai fait était de stocker N + 1 Taille pour le Il donne la sortie attendue, mais ce n'est pas aussi flexible que le code JavaScript. P> P> INT * nums code>, puis stockez le total Longueur dans la première position de mémoire. p>
La difficulté en C est qu'il n'y a pas de type de données intégré qui stocke une liste hétérogène d'éléments. Mais bien sûr, c étant c, vous pouvez construire quelque chose à vous de vous en utilisant des pointeurs et des structures, comme mon exemple ci-dessous. Le détail de la mise en œuvre désagréable est que vous avez besoin d'une bonne manière de stocker la taille de chacun de vos tableaux, d'où la nécessité d'une structure.
#include <stdio.h>
typedef struct container_t
{
int size;
int *item;
} container_t;
int main(void)
{
int a[] = {1,2,3,4};
int b[] = {123,234};
int c[] = {1};
int d[] = {1,2};
container_t s[] = {
{sizeof(a)/sizeof(a[0]), a},
{sizeof(b)/sizeof(b[0]), b},
{sizeof(c)/sizeof(c[0]), c},
{sizeof(d)/sizeof(d[0]), d}
};
for(int i = 0; i < sizeof(s)/sizeof(s[0]); i++)
{
printf("[");
for(int j = 0; j < s[i].size; j++)
printf("%d,", s[i].item[j]);
printf("]\r\n");
}
}
C'est vrai .. mais au lieu d'un [] b [] c [] j'ai besoin d'un tableau A [0] A [1], etc, etc.
@ZIBRI Bien sûr, vous pouvez également utiliser un tableau. Mais vous ne pouvez pas avoir une gamme de tableaux de différentes tailles, car vous ne pouvez pas avoir de gamme d'entités dissemblables. Vous devez utiliser un tableau de pointeurs et initialiser les tailles correctement. D'autres choses devraient rester les mêmes.
int foo() {
const unsigned char *cf[] = {
(unsigned char[]) { 2, ',', 0 },
(unsigned char[]) { 0, ',', 1, ',', 2, 0 },
(unsigned char[]) { 3, ',', 4, 0 }
};
return cf[0][0];
}
J'ai aussi pensé à cela. Je me demande s'il y a une manière plus propre sans moulages.
@ZIBRI Il n'y a pas de casse i> ici, juste des définitions.
Assumer la syntaxe est le problème ici (et non des performances), vous pouvez essayer de créer ceci à partir de zéro.
Dans les deux cas, la syntaxe est légèrement plus compliquée que dans votre code JavaScript. Je ne suis pas sûr de combien de fois plus courte peut faire cela en C, mais vous pourriez probablement en rendre un peu plus facile à lire en C ++. P>
Néanmoins, je fournis 2 approches ci-dessous. Soit en utilisant des arguments variables pour gérer la création de tableaux plus petits ou en analysant un éventail de chaînes, ce qui est sans doute plus facile à lire, mais probablement un peu plus lentement. P>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
// I don't know what type you had in mind...
typedef int type_t;
#define type_t_specifier "%d"
typedef struct tab { // Helper struct
type_t* data;
size_t size;
} tab;
tab ctb(size_t size, ...) { // Parse one of the subarrays into the temporary struct
tab res;
res.size = size;
res.data = (type_t*)malloc(res.size * sizeof(type_t));
va_list valist;
va_start(valist, size);
for (int i = 0; i < size; i++) {
res.data[i] = va_arg(valist, int);
}
return res;
}
typedef struct array_t { // Array struct
type_t** data;
size_t* sizes;
} array_t;
array_t create_array1(size_t size, ...) { // Create the array using variable arguments
array_t array;
array.data = (type_t**)malloc(size * sizeof(type_t*));
array.sizes = (size_t*)malloc((size + 1) * sizeof(size_t));
array.sizes[0] = size;
va_list valist;
va_start(valist, size);
for (int i = 0; i < size; i++) {
tab temp = va_arg(valist, tab);
array.data[i] = (type_t*)malloc(temp.size * sizeof(type_t));
array.sizes[i + 1] = temp.size;
array.data[i] = temp.data;
}
return array;
}
array_t create_array2(size_t size, const unsigned char** temp) { // Or you can simply parse an array of strings instead
array_t array;
array.data = (type_t**)malloc(size * sizeof(type_t*));
array.sizes = (size_t*)malloc((size + 1) * sizeof(size_t));
array.sizes[0] = size;
for (int i = 0; i < size; i++) {
int nsize = 1;
for (int j = 0; temp[i][j] != '\0'; j++) {
if (temp[i][j] == ',') {
nsize++;
}
}
array.data[i] = (type_t*)malloc(nsize * sizeof(type_t));
array.sizes[i + 1] = nsize;
int start = 0;
int cnt = 0;
for (int j = 0; j <= strlen(temp[i]); j++) {
if (temp[i][j] == ',' || temp[i][j] == '\0') {
sscanf(&(temp[i][start]), type_t_specifier, &array.data[i][cnt++]);
start = j + 1;
}
}
}
return array;
}
void delete_array(array_t array) { // Clean up the array
for (int i = 0; i < array.sizes[0]; i++) {
free(array.data[i]);
}
free(array.data);
free(array.sizes);
}
void print_array(array_t array) { // Just to check if it works
for (int i = 0; i < array.sizes[0]; i++) {
for (int j = 0; j < array.sizes[i + 1]; j++) {
fprintf(stderr, type_t_specifier, array.data[i][j]);
if (j != array.sizes[i + 1] - 1) fprintf(stderr, " ");
else fprintf(stderr, "\n");
}
}
}
int main(void) {
array_t myarray;
// You can either complicate the syntax a tiny bit by providing the lengths of each of the subarrays
myarray = create_array1(4, ctb(4, 1, 2, 3, 4), ctb(2, 123, 234), ctb(1, 1), ctb(2, 1, 2));
print_array(myarray);
delete_array(myarray);
// Or parse an array of strings to create your array
const unsigned char* temp[] = { "1,2,3,4", "123,234", "1", "1,2" };
myarray = create_array2(4, temp);
print_array(myarray);
delete_array(myarray);
return 0;
}
// We need to parse the size of the outer array in both cases.
struct arr {int A [4]; int b [2]; int c [1]; int d [2]; } myarray = {{1,2,3,4}, {123,234}, {1}, {1,2}}; code>n'est-ce pas possible sans structure?
Je pense que le problème de votre question est qu'il manque de tout contexte. Ni la raison pour laquelle vous en avez besoin, ni ce que vous essayez de réaliser, rien. Ce serait une bonne raison pour un bowvote.
Il est clair que j'essaie de réaliser ... j'essaie de traduire ce que je viens d'écrire dans JavaScript ... J'ai même fait le script dans la question.
Vous ne pouvez pas traduire ce que vous avez écrit dans JavaScript car la même chose exacte b> n'est pas possible dans C. JavaScript dispose de structures de données flexibles, car elle gère les choses «à la volée», pendant l'exécution. C nécessite des structures rigides, définies lors de la compilation. Afin de produire du code qui accomplit votre objectif en JavaScript, il faut en savoir plus sur ce que vous faites avec les données que de simplement l'extrait que vous avez montré, car une utilisation supplémentaire des données doit être intégrée à la structure de données dans C. Et il y a plus de différences nécessitant plus d'informations à traduire.
Cela peut être fait de différentes manières, la vraie question est ce que vous avez l'intention de faire avec elle. Sur la base de cela, nous pouvons ensuite vous dire quelle approche que vous devriez utiliser.
Exemple: cela fonctionne: Const non signé Char * cf [] = {"\ x2", "\ x0, \ x1, \ x2", "\ x3, \ x4"}; Je souhaite juste faire la même chose mais sans utiliser les citations et les octets seulement
Ok mais comment allez-vous saisir ce tableau? Êtes-vous le capital-câble ou le lisez à partir de certains fichiers / stdin?
Les matrices vraies en C ont une taille fixe. Si vous voulez quelque chose avec des dimensions variables, vous devez utiliser une table des pointeurs, chacun pointant sur un morceau de données avec une valeur sentinelle.
À titre d'exemple, en JavaScript, je pense que vous pouvez vous référer aux sous-bras avec des indices. En C, s'ils sont définis comme une structure comme
struct arr {int A [4]; int b [2]; int c [1]; int d [2]; } code>, alors vous ne pouvez pas vous référer aux compartiments avec des indices; Vous devez utiliser leurs noms. Si vous devez y parvenir avec des indices en C, une autre forme de structure de données doit être utilisée. Cela pourrait être un tableau de pointeurs. Mais si une option appropriée dépend de ce que vous voulez faire avec les données, ce qui n'est pas indiqué dans votre extrait pour la définir. Donc, plus d'informations sont nécessaires pour répondre à la question.@QuBit Scoding
Quel est le problème avec cela fonctionne i>? C'est une façon parfaitement raisonnable de gérer cela. Je produirais probablement le fichier d'un script s'il était si gros ou enclin à changer.