配列の関数についての質問です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kota

配列の関数についての質問です

#1

投稿記事 by kota » 13年前

エラーは出ないのですが実行中に
pokemon.exe の 0x773b15de でハンドルされていない例外が発生しました:
0xC0000005: 場所 0x00270000 を読み込み中にアクセス違反が発生しました
的な奴が表示されます。
恐らく関数のアドレスをいじっているあたりで何か起きてるんだと思いますが全然わかりません・・。

main-------------
#include <stdio.h>
#include "pokemon_data.h"
int main(void){
char name[50];
int *adr;
scanf("%s",name);
adr = poke_data(name);
while(adr){
printf("%d/",*adr);
adr++;
}
printf("\n");
return 0;
}
関数------------------
int *poke_data(char *name){//ポケモンの名前でステータスを選別する
int *adr;//返す用のアドレス
int i=0;
int data[6];//種族値保存用配列
char n[50];//名前代入

while(name){
n=*name;
name++; i++;
}
n='\0';

if(n=="フシギダネ"){
data[0]=45;data[1]=49;data[2]=49;data[3]=65;data[4]=65;data[5]=45;
}
adr = data;
return(adr);
}

hファイル-------------
#ifndef POKEMON_DATA_H
#define POKEMON_DATA_H

int *poke_data(char *name);

#endif//POKEMON_DATA_H
-----------------------
とりあえずフシギダネって入力したらあの数字を表示するだけのプログラムのつもりなんですが・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列の関数についての質問です

#2

投稿記事 by softya(ソフト屋) » 13年前

実際、プログラムを組んでいるとコンパイルエラーよりも実行時エラーのほうが発生頻度は高いです。
なので、よく有ることです。
あとcodeタグで囲ってくださいね。コードを見やすくなります。

最大の問題点は、ローカル変数のアドレスを返そうとしている事です。
ローカル変数は関数を抜けると消滅するので戻り値に使ってはいけません。
あとwhile(adr)も無茶です。アドレスが0になるのを期待しているとしたらとんでも無い間違いだと気づいてください。
同じ問題は while(name){にもあります。

if(n=="フシギダネ"){もこのやり方での文字列の比較はC/C++系ではできません。これはアドレス比較となるので一致することは絶対にありません。
【誤解を生む表現だったので修正】

kota さんが書きました:エラーは出ないのですが実行中に
pokemon.exe の 0x773b15de でハンドルされていない例外が発生しました:
0xC0000005: 場所 0x00270000 を読み込み中にアクセス違反が発生しました
的な奴が表示されます。
恐らく関数のアドレスをいじっているあたりで何か起きてるんだと思いますが全然わかりません・・。

コード:

main-------------
#include <stdio.h>
#include "pokemon_data.h"
int main(void){
	char name[50];
	int *adr;
	scanf("%s",name);
	adr = poke_data(name);
	while(adr){
		printf("%d/",*adr);
		adr++;
	}
	printf("\n");
	return 0;
}
関数------------------
int *poke_data(char *name){//ポケモンの名前でステータスを選別する
	int *adr;//返す用のアドレス
	int i=0;
	int data[6];//種族値保存用配列
	char n[50];//名前代入

	while(name){
		n[i]=*name;
		name++; i++;
	}
	n[i]='\0';

	if(n=="フシギダネ"){
		data[0]=45;data[1]=49;data[2]=49;data[3]=65;data[4]=65;data[5]=45;
	}
	adr = data;
	return(adr);
}

hファイル-------------
#ifndef POKEMON_DATA_H
#define POKEMON_DATA_H

int *poke_data(char *name);

#endif//POKEMON_DATA_H
-----------------------
とりあえずフシギダネって入力したらあの数字を表示するだけのプログラムのつもりなんですが・・。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

こた

Re: 配列の関数についての質問です

#3

投稿記事 by こた » 13年前

直してみたのですが今度は
Run-Time Check Failure #2 - Stack around the variable 'n' was corrupted.
というエラーを吐き出しました。
これはどういったエラーなのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列の関数についての質問です

#4

投稿記事 by softya(ソフト屋) » 13年前

こた さんが書きました:直してみたのですが今度は
Run-Time Check Failure #2 - Stack around the variable 'n' was corrupted.
というエラーを吐き出しました。
これはどういったエラーなのでしょうか?
それは、配列添字外で値の代入をした時に出るスタックでデータ破損があったと言うエラーです。
variable 'n'となっているので、配列nの処理が原因ですね。

【補足】 名前の表記は統一してくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kota

Re: 配列の関数についての質問です

#5

投稿記事 by kota » 13年前

色々申し訳ないです。

for(i=0;i<50;i++){
n=*name;
name++;
}
恐らくこれがまずいんだと思いますがどうですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列の関数についての質問です

#6

投稿記事 by softya(ソフト屋) » 13年前

そこだけだと大丈夫です。たぶん、他の部分です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kota

Re: 配列の関数についての質問です

#7

投稿記事 by kota » 13年前

すいませんあの後なぜか配列の50番目に\0を入れていました。
まだ数値がおかしいのでそこら辺を修正してみます。

kota

Re: 配列の関数についての質問です

#8

投稿記事 by kota » 13年前

無事に数字を返すことができたのですが関数のif文を全部過ぎて言っているみたいなのです。
elseを付け加えたら何を入れてもelseに入ります。
そこでnに入っている文字を表示させてみたところ打ち込んだ文字と変わらないのです。
なのにif文に入らない場合どういった原因が考えられるでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列の関数についての質問です

#9

投稿記事 by softya(ソフト屋) » 13年前

nは打ち込んだ文字列をコピーしているので同じじゃないと逆に変です。

>なのにif文に入らない場合どういった原因が考えられるでしょうか?

if文を見ないと何とも言えません。
ちなみに私の指摘した問題は修正されてますよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kota

Re: 配列の関数についての質問です

#10

投稿記事 by kota » 13年前

修正済みです。

コード:

関数--------------------------------------------------------
#include <stdio.h>
#include <string.h>

void poke_data(char *name,int *data){//ポケモンの名前でステータスを選別する
	int *ar;
	int i=0;
	int data2[6];//種族値保存用配列
	char n[50];//名前代入
	for(i=0;i<50;i++){
n[i]=*name;
name++;
}
	printf("%s\n",n);
	if(0==strcmp(n,"フシギダネ")){
		data2[0]=45;data2[1]=49;data2[2]=49;data2[3]=65;data2[4]=65;data2[5]=45;
	}
	else{
		puts("存在しないデータ");
	data2[0]=0;data2[1]=0;data2[2]=0;data2[3]=0;data2[4]=0;data2[5]=0;
	}
	for(i=0;i<6;i++){
		*data=data2[i];
		data++;
	}
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列の関数についての質問です

#11

投稿記事 by softya(ソフト屋) » 13年前

試してみましたが、ちゃんと動くようですよ。mainの部分は想像で書きましたが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kota

Re: 配列の関数についての質問です

#12

投稿記事 by kota » 13年前

マジですか。
なんでelseに入るんだろう。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列の関数についての質問です

#13

投稿記事 by softya(ソフト屋) » 13年前

mainも見せて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kota

Re: 配列の関数についての質問です

#14

投稿記事 by kota » 13年前

これです。

コード:

#include <stdio.h>
#include "pokemon_data.h"


int main(void){
    char name[50];
	int data[6];
	int i;
	scanf("%s",name);
	poke_data(name,data);
	for(i=0;i<6;i++){
		printf("%d/",data[i]);
	}
	printf("\n");
	scanf("%d");
	return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列の関数についての質問です

#15

投稿記事 by softya(ソフト屋) » 13年前

こちらで動かしたのも、こんなコードです。
メニューからリビルドしても結果は変わりませんか? あとコンパイルはちゃんと終わっていますか?

コード:

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

void poke_data( char *name, int *data ) { //ポケモンの名前でステータスを選別する
	int *ar;
	int i = 0;
	int data2[6];//種族値保存用配列
	char n[50];//名前代入
	for( i = 0; i < 50; i++ ) {
		n[i] = *name;
		name++;
	}
	printf( "%s\n", n );
	if( 0 == strcmp( n, "フシギダネ" ) ) {
		data2[0] = 45;data2[1] = 49;data2[2] = 49;data2[3] = 65;data2[4] = 65;data2[5] = 45;
	} else {
		puts( "存在しないデータ" );
		data2[0] = 0; data2[1] = 0; data2[2] = 0; data2[3] = 0; data2[4] = 0; data2[5] = 0;
	}
	for( i = 0; i < 6; i++ ) {
		*data = data2[i];
		data++;
	}
}

int main( void ) {
	char name[50];
	int data[6];//種族値保存用配列
	int i;
	scanf( "%s", name );
	poke_data( name, data );
	for( i = 0; i < 6; i++ ) {
		printf( "%d/", data[i] );
	}
	printf( "\n" );
	return 0;
}


by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kota

Re: 配列の関数についての質問です

#16

投稿記事 by kota » 13年前

今気づいたのですがファイル分けしたらif文をスルーしているみたいです。


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列の関数についての質問です

#18

投稿記事 by softya(ソフト屋) » 13年前

もしリビルドして正常に直るなら、コンパイル中にソースを直したなど作業中のミスが考えられます。
直らなかれば別の原因です。ファイル分割は直接の原因ではないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kota

Re: 配列の関数についての質問です

#19

投稿記事 by kota » 13年前

そのプログラムなら普通に動くのでmainのどこかがおかしいのだと思います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 配列の関数についての質問です

#20

投稿記事 by softya(ソフト屋) » 13年前

あとはヘッダーを間違えているぐらいしか思いつきませんね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

kota

Re: 配列の関数についての質問です

#21

投稿記事 by kota » 13年前

ごめんなさい原因がわかりました。
後からif文を少し増やしていたのですが最後にelseを入れているのにもかかわらずその前を全てifでくくっていたので最終的に上書きされていたみたいです・・。
色々手伝ってくださりありがとうございました!

kota

Re: 配列の関数についての質問です

#22

投稿記事 by kota » 13年前

本当に最後にこんな単純な間違いで申し訳ないです。

閉鎖

“C言語何でも質問掲示板” へ戻る