マトリックス比較サイズの物語について

7346 ワード

前に書く


このブログは永遠に荒れ果てていくと思っていたが...この時、コード作業に関する小さな記録用に自分でできるとは思わなかった.何年か后に振り返って不思议にも负の基础を见ている自分が真剣に记录しているという简単なことの准备をして、スタートしましょう.

タイトルセクション

//  
int main() {
  size_t total = 0, size = 0;
  scanf("%zu%zu", &total, &size);
  int matrixArr[MAX_TOTAL][MAX_SIZE][MAX_SIZE] = {};
  for (size_t matrixIndex = 0; matrixIndex < total; ++matrixIndex) {
    inputMatrices(matrixArr[matrixIndex],size);
  }
  qsort_r(matrixArr, total, sizeof(matrixArr[0]), &cmpMatrices, &size);
  for (size_t matrixIndex = 0; matrixIndex < total; ++matrixIndex) {
    printMatrices(matrixArr[matrixIndex], size);
  }
  return 0;
}
  • はまず、入力されたポインタが関数のパラメータにどのように一致するかという過コンパイルの問題です.実は振り返ってみると、簡単な配列のヘッダ要素のポインタが入っているだけです.したがって、関数パラメータにarry[]を書くだけで十分です.1行または1枚のテーブルのポインタであれば、int*ptr[num]のような定義が必要です...うーん、実は簡単な問題です.多次元配列ポインタの応用はもっと理解する必要があるでしょう.
  • はvoid型のポインタを入力し、強制的にタイプを変換してこそ、そのタイプをインクリメント・ダウンする操作を行うことができる.増分逓減はデータ型を見てバイト数を増やすためか、明確なデータ型がないと、一時的に何バイトオフセットするか分からない.
  • そしてqsort_rという見知らぬ関数で、4番目のパラメータは比較サイズルールを定義する関数を指すポインタで、5番目のパラメータはsizeのアドレスで、比較サイズの関数を書くときもデータ型を強制的に変換してから中の値を取ることができます.
  • また、コードのより移植性を向上させるためのsize_t.彼の定義のヘッダーファイルをメモしてください:stddef.h.

  • 宣言セクション

    #define MAX_TOTAL 10
    #define MAX_SIZE 4
    #include 
    
    //.h  
    void inputMatrices(int matrixArr[],size_t size);
    void printMatrices(int matrixArr[],size_t size);
    int cmpMatrices(const void *firstMatrixPtr, const void *secondMatrixPtr, void *sizePtr);
  • は、関数が様々なパラメータのフォーマットをどのように宣言するかという問題です.データ型+パラメータの名前.下手ですね.戻り値タイプも注意してください.

  • 関数定義の部分

     //.c 
    #include 
    
    void inputMatrices(int matrixArr[],size_t size){
        int x=0,y=0,count=0;
        for(x=0;xfor(y=0;yscanf("%d",(matrixArr+count++));
            }
        }
        getchar();
        return;
    }
    
    void printMatrices(int matrixArr[],size_t size){
        int x=0,y=0,count=0;
        for(x=0;xfor(y=0;y1;y++){
                printf("%d ",*(matrixArr+count++));
            }
            printf("%d
    "
    ,*(matrixArr+count++)); } printf("
    "
    ); return; } int cmpMatrices(const void *firstMatrixPtr, const void *secondMatrixPtr, void *sizePtr){ size_t *matrixSizePtr = (size_t *)sizePtr; size_t matrixSize = *matrixSizePtr; int * use; int usenum=0,count=0; int sumfirst=0,sumsecond=0,x=0,y=0; for(x=0;xfor(y=0;yif(x==y || x+y==matrixSize-1){ use = ((int *)(firstMatrixPtr)+count++); usenum = *use; sumfirst+=usenum;} else count++; } } count=0; for(x=0;xfor(y=0;yif(x==y || x+y==matrixSize-1){ use = ((int *)(secondMatrixPtr)+count++); usenum = *use; sumsecond+=usenum;} else count++; } } if(sumfirst==sumsecond){ return 0; }else if(sumfirst>sumsecond){ return 1; }else{ return -1; } }
  • はまず強制変換タイプの再オフセットポインタの問題です!
  • にはもう一つの思考上のピットがあります.main関数では、定義された1枚の配列表が4 x 4形式なので、入力された配列表も4 x 4形式です.入力した配列が4 x 4の規模より小さい場合、このテーブルには空の位置があります.では...空いているのはどこですか.一瞬の反応で言えば、右と下を空けて、数字を行列で並べたに違いない.このとき,入出力や大きさを判断する関数は,空の位置をスキップして正しいsum値を得る必要がある.しかし…まだ空席があることを全く考慮していない私は直接入力した行列のデータを連続的に蓄積して、形式上これらの数字はまったく1つの行列ではないように見えますが、入力出力と大きさを判断する関数の中で同じ操作アドレスの思考を維持すれば、x、yで増加してこれらの連続数字を正方形の行列と見なして、正解も得られます...最初から4 x 4のマトリクスが伝わっていることを知っていたら...マトリクスが並ぶように見えるように努力するに違いありません.まぁ…ということは、データが連続していても、ループでいろいろな配列の形を「見る」ことができる場合があるということですね.データ構造もそうかもしれませんが...みんな1つのメモリ空間に連続的に格納されていますが、他の人が追加した変数の制限や文の機能があって、想像していた構造のタイプになりました....とんでもないことを言ったようです.

  • 最後に


    よく覚えておきたいブログですね…サボらずに、学んだことを書いてみましょう.