0

私はCを初めて使用し、ノードスワッピングをテストするためのテストケースを作成しようとしていますが、テストケースを作成する方法がわかりません。誰かが私に例を与えることができれば、素晴らしいでしょう。どうも

値がスワップされないので、誰かが私のスワップ関数で何が間違っているのか教えてもらえますか?

#include <stdio.h>
#include <stdlib.h>


 struct lnode {
    int data;
    struct lnode* next;
 };


 void swap(int* a, int* b );

 int main()
    {
      int x = 10;
  int y = 14;

  swap(&x, &y);
  swapNodes(x, y);
  getchar();
  return 0;
    }

   void swap(int* a, int* b )
  {
  int* temp;
  temp = a;
  a = b;
  b = temp;

  printf("x= %d  y= %d",*a,*b);
   }

   void swapNodes(struct lnode* n1, struct lnode* n2)
   {
    struct lnode* temp;
    temp = n1->next;
    n1->next = n2;
    n2->next = temp;
   }
4

3 に答える 3

1

最も単純なテストケースから始めます。ノードスワップを実行するには、2つのノードが必要です。2つのノード構造を宣言し、各ノードに異なる値を割り当て、ノードを交換して、結果を出力するだけです。このようなもの:

struct lnode nodeA, nodeB;

nodeA.data = 1;
nodeB.data = 2;

swapNodes(&nodeA, &nodeB);

printf("nodeA has value %d, should be 2\n", nodeA.data);
printf("nodeB has value %d, should be 1\n", nodeB.data);
于 2013-02-23T22:02:57.567 に答える
0

スワップ機能が間違っている場合は、次のように変更してください

void swap(int* a, int* b )
{
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
  printf("x= %d  y= %d",*a,*b);
}

次に、値を変更します。これは、何aを変更できずb、それらの引数で指しているためです。

それが機能しなかった理由はこれです

void swap(int* a, int* b )
{
  int* temp; // pointer 
  temp = a;  // temppointing to same as a is pointing to

        +------------+
temp -> | some value |
        +------------+

  a = b;   // a now pointing to same as b is pointing to  

     +------------------+
a -> | some other value |
     +------------------+

  b = temp;  // b now pointing to same as temp pointing to, a

     +------------+
b -> | some value |
     +------------+

しかし、関数から戻ったとき、ポインターは同じままです。whatを変更しa`b point to you need to have argumentsswap(int ** a、int ** b)`を実行する場合

に似ている

int foo(int a) {
a = 123;
}

int a = 1;
foo(a);

toの呼び出しfooは引数を変更せず、関数aから戻るときに引数がコピーされてから変更されるだけで、元の値が保持されます。

int foo(int* a)
{
  *a = 1;
}

aを指すかではなく値を変更しますが、それでも同じ場所を指します

int foo(int**a )
{
  *a = malloc(sizeof(int)); // changes where a points to
...
}
于 2013-02-23T22:39:30.800 に答える
0

テストを行うのはとても簡単です。プリプロセッサマクロを使用すると、ひるむことなくそれを行うことができます。たとえば、次のようになります。

int main()
{
  int x = 10;
  int y = 14;

  swap(&x, &y);
  swapNodes(x, y);
  getchar();
  return 0;
}

成功する

#define TEST
#ifndef TEST
int main()
{ //regular running
  int x = 10;
  int y = 14;

  swap(&x, &y);
  swapNodes(x, y);
  getchar();
  return 0;
}
#endif
#ifdef TEST
    int main()
{
    //test your code!
    return 0;
}
#endif

#Cを作るときの指示#define TESTです。「テストモードになっています」という意味です。#ifndef TEST「テストしていない場合」を意味します。#ifdef TEST「テストしている場合」を意味します。私たちは使用することができた

} //end regular main
#else
int main() //begin test main

しかし、それは実際には問題ではありません。#define線がすべての線の前に来る#ifdefように注意してください#ifndef

それでも問題が解決しない場合は、プリプロセッサマクロを使用して印刷ステートメントをカバーしてみてください。

#define DEBUG
#ifdef DEBUG
#include <stdio.h>
#endif

...

void myFunc(){
    int x = 0;
    #ifdef DEBUG
    printf("%d", x);
    #endif
}

本当に必要な場合は、コンパイル中に物事を定義できます(これはより洗練されていると見なされます)。

gcc -DDEBUG -DTEST -o swap_test swap.c

それでも問題が解決しない場合は、GDBをチェックしてコードをデバッグする必要があります。Ubuntuを使用している場合は、ソフトウェアセンターにあると思います。

そして、あなたのコードの実際の何が問題になっていますか?まあ、それは長期的にはあなたを助けるつもりはないので、私はあなたに話すつもりはありません。

于 2013-02-23T22:52:42.263 に答える