私はいくつかの配列を順番に整列させ、ある種の分類を実行しています。私は、実行したい操作を簡単にするために、他の配列を保持する配列を作成しました。ループ内の配列のサイズを取得する方法
悲しいことに、私のプログラムが実行されたときにクラッシュして、デバッグを続けてsizeof
オペレータが私にポインタのサイズを与えてループ内の配列を与えていないことを実感しました。私は厄介な解決法と私のプログラム働いた。
どうすればこの厄介な方法を避けることができますか?私はループ内で計算したい!
#include <iostream>
#include <string>
#define ARRSIZE(X) sizeof(X)/sizeof(*X)
int classify(const char *asset, const char ***T, size_t T_size, size_t *index);
int main(void)
{
const char *names[] = { "book","resources","vehicles","buildings" };
const char *books[] = { "A","B","C","D" };
const char *resources[] = { "E","F","G" };
const char *vehicles[] = { "H","I","J","K","L","M" };
const char *buildings[] = { "N","O","P","Q","R","S","T","U","V" };
const char **T[] = { books,resources,vehicles,buildings };
size_t T_size = sizeof(T)/sizeof(*T);
size_t n, *index = new size_t[T_size];
/* This will yeild the size of pointers not arrays...
for (n = 0; n < T_size; n++) {
index[n] = ARRSIZE(T[n]);
}
*/
/* Cumbersome solution */
index[0] = ARRSIZE(books);
index[1] = ARRSIZE(resources);
index[2] = ARRSIZE(vehicles);
index[3] = ARRSIZE(buildings);
const char asset[] = "L";
int i = classify(asset, T, T_size, index);
if (i < 0) {
printf("asset is alien !!!\n");
}
else {
printf("asset ---> %s\n", names[i]);
}
delete index;
return 0;
}
int classify(const char *asset, const char ***T, size_t T_size, size_t *index)
{
size_t x, y;
for (x = 0; x < T_size; x++) {
for (y = 0; y < index[x]; y++) {
if (strcmp(asset, T[x][y]) == 0) {
return x;
}
}
}
return -1;
}
'std :: vector>'を使うことをお勧めします。 –
NathanOliver
C++ヘッダー( 'iostream'、' string')とC関数( 'printf、strcmp')が混在しています。一つの言語を選んでください。 – Andrew
両方の言語を混在させると何が問題になりますか?コンパイラは不平を言うことはありません。リスクはありますか?または1つの言語を持つだけでいいですか? C++はcにスーパーです。 cのすべてがC++になっています。 –