掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.30437

プログラムのエラー
投稿者---koi(2007/07/03 19:10:08)


以下のプログラムを組んだら、ビルドをしてもエラーは出なかったのですが、プログラムを実行したらエラーが出てしまいました。どこが間違っているのでしょうか。

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

struct p_node   
{
    unsigned int    no;
    char        name[20];
    unsigned int    c;
    struct p_node   *b;
};

static struct p_node     *d[9] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};


void opfile( void );
int func(int key);
struct p_node *search(int key);



int main(void)
{
    struct p_node *node, *head;
    char    name[20], buf[50];
    int num_menu;
    struct  p_node    *p;
    int key, i;

    opfile();
    while (1)
    {
         printf("メニュー番号入力?\n");
        printf("1:探索\n");
        printf("2:終了\n");
        gets(buf);
        num_menu = atoi(buf);
        printf("\n");

            if (!(num_menu >= 1 && num_menu <= 2))
            {
              printf("1,2のいずれかの数字を入力してください!\n");
            }
              else if (num_menu == 2)
         {
              break;
            }
        else
        {
            printf("Number?\n");
            gets(buf);
            key = atoi(buf);
            printf("\n");
            if ( (key == 0) && ( (buf[0] != '0') || (buf[1] != '\0') ) )
            {
                printf("0以上の整数を入力してください!\n");
                continue;
            }
            if ( (node = search(key)) != NULL)
            {
                printf("学生番号:%d\t氏名:%s\t成績:%d\n", node->no, node->name, node->c);
                printf("\n");
            }
            else
            {
                printf("学生番号%dのデータが存在しません\n", key);
            }
        }
    }
    
    for (i = 0; i < 11; i++)
    {
    head = d[i];
    while (head)
        {
        p = head;
        head = head->b;
        free(p);
        }
    }
    
    return 1;
}



void opfile( void )
{
    FILE *fp;
    char str[256];
    char *p_str;
    struct p_node *node;
    int f;
    

    if( ( fp = fopen( "i.txt", "r" ) ) == NULL )
    {
        printf("i.txtが存在しません!\n");
        exit(1);
    }

   
    while( fgets( str, 256, fp ) != NULL )
    {
        if ( (node = malloc(sizeof(struct  p_node))) == NULL)
        {
            exit(1);
        }
        p_str = strtok( str, "  \n" );
        node->no = atoi(p_str);
        p_str = strtok( NULL, " ,\n" );
        strcpy( node->name, p_str );
        p_str = strtok( NULL, " ,\n" );
        node->c = atoi( p_str );
        f = func(node->no);
        node->b = d[f];
        d[f] = node;
    }

    fclose( fp );
}


int func(int key)
{
    int i;
    i=key%9;
    return i;
}


struct p_node *search(int key)
{
    struct p_node *ptr;
    int a;
    a=key%9;
    ptr=d[a];
    while(ptr!=NULL){
        if(ptr->no==key){
            return ptr;
        }
        ptr=ptr->b;
    }
    return NULL;
}


エラー内容
Debug Assertion Failed!

Program: ...
File: strtol.c
Line: 94

Expression: nptr != NULL

For information on how your program can cause an assertion
failure, see the visual C++ documentation on asserts

i.txtの内容
2 Kojima 235
4 Nagai 564
5 Kitajima 124
6 Kawai 784
8 Sato 953
7 Saito 492
2 Suzuki 761
1 Shimizu 356
3 Takahashi 164
6 Kudou 121
9 Ono 684
7 Oohashi 265
4 Kitagawa 427
1 Nagashima 692

環境 visual Studio 2005 C++
windows XP


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:プログラムのエラー 30438 bugs 2007/07/03 20:06:31
<子記事> Re:プログラムのエラー 30442 επιστημη 2007/07/03 22:22:17
<子記事> Re:プログラムのエラー 30445 きゅー 2007/07/03 23:27:26


No.30438

Re:プログラムのエラー
投稿者---bugs(2007/07/03 20:06:31)


コードをざっとながめただけですが…。

> static struct p_node     *d[9] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};

>    for (i = 0; i < 11; i++)
>    {
>    head = d[i];

添字の値が定義範囲外になるのはまずいでしょうね。




この投稿にコメントする

削除パスワード

No.30441

Re:プログラムのエラー
投稿者---koi(2007/07/03 21:42:51)


> for (i = 0; i < 11; i++)
そこは私のミスでした。
for (i = 0; i < 9; i++)


に直しても同じエラーが発生します。
なぜなのでしょうか。


この投稿にコメントする

削除パスワード

No.30442

Re:プログラムのエラー
投稿者---επιστημη(2007/07/03 22:22:17)
http://blogs.wankuma.com/episteme


i.txt の末尾に(改行だけの)空行があるんじゃないすか?


この投稿にコメントする

削除パスワード

No.30448

Re:プログラムのエラー
投稿者---koi(2007/07/04 12:24:53)


>i.txt の末尾に(改行だけの)空行があるんじゃないすか?
ご指摘ありがとうございます。
その部分を修正したらプログラムが正しく起動しました。
ありがとうございました。


この投稿にコメントする

削除パスワード

No.30445

Re:プログラムのエラー
投稿者---きゅー(2007/07/03 23:27:26)


説明がないので、見て気が付いた点を。

opfile関数で、
node->bにNULLを設定していません。

search関数で、
ptr=ptr->bを設定してますが、NULLが入っていると
いうことはないでか。

key%9 とかは、正しい値を求められているのですか。

Program: ...
File: strtol.c
Line: 94

Expression: nptr != NULL
は、ヒントにならないのですか。?



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧