2016-05-15 58 views
0

私はかなり長い間Cを使用していません。| 2次元配列でC

私は各要素が1または0である2次元配列を持っています。1つまたは複数の行があるかどうかを知りたいと思います。私はそうしています:

for (row = xa; row < 50; row++) { 
// need to know first if there is any '1' in the next line 
    if (|schemaArray[row] == 1) { 
     printf("1 found in row %d\n",row); 
    } 
} 

私は間違っていますか?

schemaArrayは私のパラメータリスト内の引数である:

int findPerimeter(int schemaArray[50][50]) { 
+0

を見つける(| schemaArray [行] == 1)'条件はありませんコンパイル。しかし、それを正しく使う方法は教えてくれません。 –

答えて

2

あなたは1が存在するかどうかを確認するために、行のすべての列を反復を持つことになります。

サンプルコード:

for (int row = xa; row < 50; row++) { 
    int bIsOne = 0; 
    for (int i = 0;i < col_size && !bIsOne; i++) { 
    bIsOne = bIsOne | schemaArray[row][i]; 
    } 
    if(bIsOne) 
    printf("1 found in row %d\n",row); 
} 

あなたはschemaArrayのビットマップを構築しない限り、これはビット単位の演算子を使用して行うことはできません。その場合、一度に行全体をチェックすることができます。

これは大部分が過剰です。あなたのコードが性能重視の場合にのみ実行してください。

前処理ステップ:

for (int i = 0; i < row_count; i++) { 
    if(bitMapSchemaArray[i]) 
    printf("There is a 1 in %d row\n", i+1); 
} 

しかし、ほとんどで、あなたが持っていることができるようになります:あなたの関数ではschemaArray

long long bitMapSchemaArray[ROW_SIZE]; 
for (int i = 0; i < row_count; i++) { 
    long long columnBitMap = 0; 
    for (int j = 0; j < col_count; j++) { 
    columnBitMap <<= 1; // Multiplies by 2 
    columnBitMap = columnBitMap | schemaArray[i][j]; // Add a 1 if schemaArray[i][j]=1 else 0 
    } 
    bitMapSchemaArray[i] = columnBitMap; 
} 

のビットマップ配列を構築し、あなたがして、ビットマップを使用することができます64ビット整数の配列を使用すると仮定すると、2-D配列の64列。もちろん、これを外挿して、ceil(column_count)/64の64ビット整数を使用することで、64列以上の値を得ることもできます。その場合、累積結果が依然としてゼロでないかどうかをビットごとにORでチェックします。

2

シンプルなだけの行全体を反復して、コンパイラはあなたが `場合以来、それは間違って使用しているあなたを語っている

for (row = 0; row < 50; row++) { 
    for (col= 0; row < 50; col++) { 
     if (schemaArray[row][col] == 1){ 
      printf("1 found in row %d\n",row); 
      break; 
     } 
    } 
}