配列の関数についての質問です
-
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=*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
-----------------------
とりあえずフシギダネって入力したらあの数字を表示するだけのプログラムのつもりなんですが・・。
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: 配列の関数についての質問です
実際、プログラムを組んでいるとコンパイルエラーよりも実行時エラーのほうが発生頻度は高いです。
なので、よく有ることです。
あとcodeタグで囲ってくださいね。コードを見やすくなります。
最大の問題点は、ローカル変数のアドレスを返そうとしている事です。
ローカル変数は関数を抜けると消滅するので戻り値に使ってはいけません。
あとwhile(adr)も無茶です。アドレスが0になるのを期待しているとしたらとんでも無い間違いだと気づいてください。
同じ問題は while(name){にもあります。
if(n=="フシギダネ"){もこのやり方での文字列の比較はC/C++系ではできません。これはアドレス比較となるので一致することは絶対にありません。
【誤解を生む表現だったので修正】
なので、よく有ることです。
あと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: 配列の関数についての質問です
直してみたのですが今度は
Run-Time Check Failure #2 - Stack around the variable 'n' was corrupted.
というエラーを吐き出しました。
これはどういったエラーなのでしょうか?
Run-Time Check Failure #2 - Stack around the variable 'n' was corrupted.
というエラーを吐き出しました。
これはどういったエラーなのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 配列の関数についての質問です
それは、配列添字外で値の代入をした時に出るスタックでデータ破損があったと言うエラーです。こた さんが書きました:直してみたのですが今度は
Run-Time Check Failure #2 - Stack around the variable 'n' was corrupted.
というエラーを吐き出しました。
これはどういったエラーなのでしょうか?
variable 'n'となっているので、配列nの処理が原因ですね。
【補足】 名前の表記は統一してくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
kota
Re: 配列の関数についての質問です
色々申し訳ないです。
for(i=0;i<50;i++){
n=*name;
name++;
}
恐らくこれがまずいんだと思いますがどうですか?
for(i=0;i<50;i++){
n=*name;
name++;
}
恐らくこれがまずいんだと思いますがどうですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 配列の関数についての質問です
そこだけだと大丈夫です。たぶん、他の部分です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
kota
Re: 配列の関数についての質問です
無事に数字を返すことができたのですが関数のif文を全部過ぎて言っているみたいなのです。
elseを付け加えたら何を入れてもelseに入ります。
そこでnに入っている文字を表示させてみたところ打ち込んだ文字と変わらないのです。
なのにif文に入らない場合どういった原因が考えられるでしょうか?
elseを付け加えたら何を入れてもelseに入ります。
そこでnに入っている文字を表示させてみたところ打ち込んだ文字と変わらないのです。
なのにif文に入らない場合どういった原因が考えられるでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 配列の関数についての質問です
nは打ち込んだ文字列をコピーしているので同じじゃないと逆に変です。
>なのにif文に入らない場合どういった原因が考えられるでしょうか?
if文を見ないと何とも言えません。
ちなみに私の指摘した問題は修正されてますよね?
>なのにif文に入らない場合どういった原因が考えられるでしょうか?
if文を見ないと何とも言えません。
ちなみに私の指摘した問題は修正されてますよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
kota
Re: 配列の関数についての質問です
修正済みです。
関数--------------------------------------------------------
#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: 配列の関数についての質問です
試してみましたが、ちゃんと動くようですよ。mainの部分は想像で書きましたが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 配列の関数についての質問です
mainも見せて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
kota
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 配列の関数についての質問です
こちらで動かしたのも、こんなコードです。
メニューからリビルドしても結果は変わりませんか? あとコンパイルはちゃんと終わっていますか?
メニューからリビルドしても結果は変わりませんか? あとコンパイルはちゃんと終わっていますか?
#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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 配列の関数についての質問です
もしリビルドして正常に直るなら、コンパイル中にソースを直したなど作業中のミスが考えられます。
直らなかれば別の原因です。ファイル分割は直接の原因ではないと思います。
直らなかれば別の原因です。ファイル分割は直接の原因ではないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 配列の関数についての質問です
あとはヘッダーを間違えているぐらいしか思いつきませんね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
kota
Re: 配列の関数についての質問です
ごめんなさい原因がわかりました。
後からif文を少し増やしていたのですが最後にelseを入れているのにもかかわらずその前を全てifでくくっていたので最終的に上書きされていたみたいです・・。
色々手伝ってくださりありがとうございました!
後からif文を少し増やしていたのですが最後にelseを入れているのにもかかわらずその前を全てifでくくっていたので最終的に上書きされていたみたいです・・。
色々手伝ってくださりありがとうございました!