Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

コンパイルが通らない

419 views
Skip to first unread message

sunao furukawa

unread,
Mar 17, 2009, 10:24:59 PM3/17/09
to
 古川と申します。
 以下のようなプログラムをVisual C++ 2008 express editionでコンパイルしようとしているのですが、デバッグの段階で中断しています。いろいろやってみたのですが原因不明のデバッグの中断になってしまうこともありました。特にmainの段階での上手なプログラムの書き方を教えてください。

<出力>
------ ビルド開始: プロジェクト: h17spring001, 構成: Debug Win32 ------
コンパイルしています...
h17spring001.cpp
.\h17spring001.cpp(45) : error C2664: 'print_string' : 3 番目の引数を
'CHARPROF **' から 'CHARPROF *' に変換できません。(新しい機能 ; ヘルプを参照)

指示された型は関連がありません。変換には reinterpret_cast、C スタイル
キャストまたは関数スタイルのキャストが必要です。
ビルドログは "file://c:\Users\sunao\Documents\Visual Studio
2008\Projects\h17spring001\h17spring001\Debug\BuildLog.htm" に保存されました。

h17spring001 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========


<プログラム>
// h17spring001.cpp : メイン プロジェクト ファイルです。

#include "stdafx.h"
#include <stdio.h>
using namespace System;
typedef struct{ char char_p;
int char_w;
} CHARPROF;
void print_string(int,char *[],CHARPROF *,int);
int word_width(char *,CHARPROF *);

void print_string(int line_w, char *str_list[], CHARPROF *char_list, int
space_w){
int cur_w = 0, str_w , idx;
for(idx = 0; str_list[idx] != NULL; idx++){
str_w = word_width(str_list[idx],char_list);
cur_w += str_w;
if(cur_w == str_w)
printf("%s", str_list[idx]);
else{
cur_w += space_w;
if(cur_w <= line_w)
printf(" %s",str_list[idx]);
else{
cur_w = str_w;
printf("\n%s",str_list[idx]);
}
}
}
putchar('\n');
}
int word_width(char *str, CHARPROF *char_list){
int print_w = 0,idx;
while(*str !='\0'){
for(idx = 0; *str != char_list[idx].char_p; idx++);
print_w += char_list[idx].char_w;
str++;
}
return print_w;
}

int main(void)
{
CHARPROF *test0001;
char *z[10]={"Hello World"};
print_string(80,z,&test0001,1);
}

ちゅ

unread,
Mar 18, 2009, 2:22:24 AM3/18/09
to
ちゅ です。

On Wed, 18 Mar 2009 11:24:59 +0900
"sunao furukawa" wrote
in message news:eyO4#C3pJH...@TK2MSFTNGP05.phx.gbl...
> コンパイルが通らない


> int main(void)
> {
> CHARPROF *test0001;
> char *z[10]={"Hello World"};
> print_string(80,z,&test0001,1);
> }

> CHARPROF *test0001;
ポインターで宣言して

> print_string(80,z,&test0001,1);
ポインターのアドレスを渡してますね。

その他の関数の内容は見ていないので…。
--
ちゅ

sunao furukawa

unread,
Mar 18, 2009, 3:24:38 AM3/18/09
to

"ちゅ" <jpa...@microsoft.com> wrote in message
news:20090318152028...@microsoft.com...
ちゅさん、早速のレスありがとうございました。
mainのところですがもともと最初に書いたのは次のようなプログラムです。

int main(void)
{
print_string(80, "Hello World",char_list,1);
}

<出力>
------ ビルド開始: プロジェクト: h17spring001, 構成: Debug Win32 ------
コンパイルしています...
h17spring001.cpp

.\h17spring001.cpp(43) : error C2065: 'char_list' : 定義されていない識別子です。

ビルドログは "file://c:\Users\sunao\Documents\Visual Studio
2008\Projects\h17spring001\h17spring001\Debug\BuildLog.htm" に保存されました。

h17spring001 - エラー 1、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

というわけで、char_listの定義の仕方がわかりません、どなたかいい例を教えてください。

ちゅ

unread,
Mar 18, 2009, 3:52:57 AM3/18/09
to
ちゅ です。

On Wed, 18 Mar 2009 16:24:38 +0900
"sunao furukawa" wrote
in message news:25CE5B8D-BBA0-4006...@microsoft.com...
> Re: コンパイルが通らない

>.\h17spring001.cpp(43) : error C2065: 'char_list' : 定義されていない識別子です。

定義されていない識別子 なので

CHARPROF char_list; // 実体を定義

 // char_list のポインター(アドレス)を渡す
 print_string(80, "Hello World", &char_list,1);

 その他の関数の内容は見ていないので…。
 C++入門
 http://www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html
 一度、読まれて見てください。 
--
ちゅ

sunao furukawa

unread,
Mar 18, 2009, 9:24:36 PM3/18/09
to
古川です。

"ちゅ" <jpa...@microsoft.com> wrote in message
news:20090318164419...@microsoft.com...
> ちゅ です。

>
>>.\h17spring001.cpp(43) : error C2065: 'char_list' : 定義されていない識別子です。
> 定義されていない識別子 なので
>
> CHARPROF char_list; // 実体を定義
>
>  // char_list のポインター(アドレス)を渡す
>  print_string(80, "Hello World", &char_list,1);
>
早速次のようにプログラムを変更してデバッグを実行してみましたが・・・。

for(idx = 0; (*str)!= char_list[idx].char_p; idx++);


print_w += char_list[idx].char_w;
str++;
}
return print_w;
}

int main(void)
{
CHARPROF test0001;
char *z[10]={"この広い野原いっぱい咲く花をひとつ残らずあなたにあげる"};
print_string(80,z,&test0001,1);
}

<出力>
'h17spring001.exe': 'C:\Users\sunao\Documents\Visual Studio
2008\Projects\h17spring001\Debug\h17spring001.exe' を読み込みました。シンボルが読み込まれました。
'h17spring001.exe': 'C:\Windows\System32\ntdll.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\mscoree.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\kernel32.dll' を読み込みました
'h17spring001.exe':
'C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\msvcr90d.dll'
を読み込みました
'h17spring001.exe':
'C:\Windows\winsxs\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\msvcm90d.dll'
を読み込みました
'h17spring001.exe': 'C:\Windows\System32\ole32.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\msvcrt.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\gdi32.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\user32.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\advapi32.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\rpcrt4.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\imm32.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\msctf.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\lpk.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\usp10.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\shlwapi.dll' を読み込みました
'h17spring001.exe':
'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6000.16386_none_5d07289e07e1d100\comctl32.dll'
を読み込みました
'h17spring001.exe':
'C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll' を読み込みました

'h17spring001.exe':
'C:\Windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.3053_none_d08d7bba442a9b36\msvcr80.dll'
を読み込みました
'h17spring001.exe': 'C:\Windows\System32\shell32.dll' を読み込みました
'h17spring001.exe':
'C:\Windows\Microsoft.NET\Framework\v2.0.50727\Culture.dll' を読み込みました
'h17spring001.exe':
'C:\Windows\Microsoft.NET\Framework\v2.0.50727\Culture.dll' をアンロード
'h17spring001.exe':
'C:\Windows\assembly\NativeImages_v2.0.50727_32\mscorlib\c068708e16abf0be77a21b9f29817d83\mscorlib.ni.dll'
を読み込みました
'h17spring001.exe' (マネージ型):
'C:\Windows\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'
が読み込まれました
'h17spring001.exe': 'ImageAtBase0x6f5b0000' を読み込みました
'h17spring001.exe': 'ImageAtBase0xd20000' を読み込みました。シンボルが読み込まれていません。
'h17spring001.exe': 'ImageAtBase0x6f5b0000' をアンロード
'h17spring001.exe':
'C:\Windows\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_ja_b77a5c561934e089\mscorlib.resources.dll'
を読み込みました。バイナリはデバッグ情報と一緒にビルドされませんでした。
'h17spring001.exe' (マネージ型):
'C:\Windows\assembly\GAC_MSIL\mscorlib.resources\2.0.0.0_ja_b77a5c561934e089\mscorlib.resources.dll'
が読み込まれました
'h17spring001.exe' (マネージ型): 'c:\Users\sunao\Documents\Visual Studio
2008\Projects\h17spring001\Debug\h17spring001.exe' が読み込まれました。シンボルが読み込まれました。
'h17spring001.exe':
'C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll' を読み込みました

'h17spring001.exe':
'C:\Windows\Microsoft.NET\Framework\v2.0.50727\diasymreader.dll' を読み込みました
'h17spring001.exe': 'C:\Windows\System32\rsaenh.dll' を読み込みました
'h17spring001.exe' (マネージ型):
'C:\Windows\WinSxS\x86_microsoft.vc90.debugcrt_1fc8b3b9a1e18e3b_9.0.30729.1_none_bb1f6aa1308c35eb\msvcm90d.dll'
が読み込まれました
'h17spring001.exe':
'C:\Windows\assembly\NativeImages_v2.0.50727_32\System\57ac9ba5419d6bf4b79f2979b0755428\System.ni.dll'
を読み込みました
'h17spring001.exe' (マネージ型):
'C:\Windows\assembly\GAC_MSIL\System\2.0.0.0__b77a5c561934e089\System.dll'
が読み込まれました
'System.AccessViolationException' の初回例外が h17spring001.exe で発生しました。

'System.AccessViolationException' のハンドルされていない例外が
h17spring001.exe で発生しました。

追加情報: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。

<中断しました>
という出力が出て止まってしまいます。カーソルは、34行目の

for(idx = 0; (*str)!= char_list[idx].char_p; idx++);

という行で止まっています。このプログラムは平成17年の春の基本情報技術者試験のプログラムにmainの行を書き加えて実行しようと思ったものです。
そのためとは言いませんがどのように直したらいいのかわかりません。どなたか御教授の方お願いします。


ちゅ

unread,
Mar 19, 2009, 3:17:44 AM3/19/09
to
ちゅ です。

On Thu, 19 Mar 2009 10:24:36 +0900
"sunao furukawa" wrote
in message news:DA16D912-C143-4F41...@microsoft.com...
> Re: コンパイルが通らない
> このプログラムは平成17年の春の基本情報技術者試験の
>プログラムにmainの行を書き加えて実行しようと思ったものです。
>そのためとは言いませんがどのように直したらいいのかわかりません。

先ずはC言語の勉強から始めて下さい。
C言語が分からない状態で説明しても無駄になります。

最低限度、自分でコードを読む事が出来なければ
先に進めませんよ。
文法とポインター・配列・文字列の概念などは最低限度
習得しておかないとこの問題は分からないと思います。

--
ちゅ

sunao furukawa

unread,
Mar 22, 2009, 1:45:24 AM3/22/09
to

"ちゅ" <jpa...@microsoft.com> wrote in message
news:20090319160742...@microsoft.com...

>
> 先ずはC言語の勉強から始めて下さい。
> C言語が分からない状態で説明しても無駄になります。
>
> 最低限度、自分でコードを読む事が出来なければ
> 先に進めませんよ。
> 文法とポインター・配列・文字列の概念などは最低限度
> 習得しておかないとこの問題は分からないと思います。
>
 一応、C言語の参考書やポインタを特集した書籍などは学習したつもりなのですが、私の理解が足りないだけでなく、書籍の中にもchar型へのポインタの配列を引数にした関数をmainの中で実行するプログラムを書いた書籍は所持している数冊のCおよびC++の本の中にはありませんでした。
 私が書いたプログラムの中でこれでだめな理由のわからないものがあります。どうしても'print_string'の2番目の引数を 'char *' から 'char *[]' に変換できません。
 あと、少し気になったことなのですが、構造体の変数の初期化をするとエラーになります。zの配列についても初期化をしようとするとエラーになります。scanfを使う気はないので文字列もしくは定数で初期化したいです。でないとポインタがどこを指定するかわからずこの前のような原因不明のエラー(プログラムの暴走)になると思います。
 ではプログラムを以下に示します。

int main(void)
{
CHARPROF test0001;
char z[12]="Hello world";
print_string(80,&z[0],&test0001,1);
}

<出力>
------ ビルド開始: プロジェクト: h17spring001, 構成: Debug Win32 ------
コンパイルしています...
h17spring001.cpp

.\h17spring001.cpp(45) : error C2664: 'print_string' : 2 番目の引数を 'char
*' から 'char *[]' に変換できません。(新しい機能 ; ヘルプを参照)


指示された型は関連がありません。変換には reinterpret_cast、C スタイル
キャストまたは関数スタイルのキャストが必要です。

やま

unread,
Mar 22, 2009, 12:49:21 PM3/22/09
to
やまです。

http://情報処理試験.jp/FE17a-pm/t06.html
ですか。

このプログラムが何をするものかは分かっていますか?
print_string()の第3引数にも値を設定する必要がある
というのは分かりますか。
print_string()の第2引数は単語の配列で最後は NULL と
あることにも注意してください。
こんな感じかな。(プログラムとしては不完全です)

int main(void)
{
CHARPROF test0001[] = {
{'T', 10}, {'h', 7}, {'i', 5}, {'s', 7},
{'a', 7}, {'p', 7}, {'e', 7}, {'n', 7},
{'.', 3} /* 数値は適当 */
};
char *z[]={"This", "is", "a", "pen.", NULL};

/* 改行させてみる */
print_string(60, &z[0], test0001, 1);
return 0;
}
---
やま

ちゅ

unread,
Mar 22, 2009, 9:52:55 PM3/22/09
to
ちゅ です。

On Mon, 23 Mar 2009 01:49:21 +0900
"やま" wrote
in message news:ObxHh4wq...@TK2MSFTNGP04.phx.gbl...

> http://情報処理試験.jp/FE17a-pm/t06.html
こんなWebが有るんですね。
知らなかった…。
--
ちゅ

sunao furukawa

unread,
Mar 23, 2009, 2:24:29 AM3/23/09
to
どうもありがとうございます。古川です。

"やま" <syam...@hotmail.com> wrote in message
news:ObxHh4wq...@TK2MSFTNGP04.phx.gbl...

 勉強になりました。どうもありがとうございます。理解できたことを書いてみます。

 1、英文の文字と文字幅を考えてcharへのポインタ型の配列z[]の内容を決める("This"などは文字列の配列で値としてその文字列の先頭のアドレスを持つ)。
 2、構造体CHARPROFは1で決めた配列に沿った内容で文字そのもの(''でくくる)と文字ごとの文字幅のサイズを決めて初期化する。
 3、改行させたい時はint line_wの値(この場合は60)を超えるようにCHARPROFの各int char_wの値(もしくは合計値)を決める。

 文を書くのが下手なのでちゃんと表現できてはいないかもしれませんが自分なりには以上のように理解しました。疑問は解決しました。何回も下手な質問をしたにもかかわらず、親切なご回答ありがとうございました。

やま

unread,
Mar 23, 2009, 5:04:54 AM3/23/09
to
やまです。

> 1、英文の文字と文字幅を考えてcharへのポインタ型の配列z[]の内容を決める(
>"This"などは文字列の配列で値としてその文字列の先頭のアドレスを持つ)。
> 2、構造体CHARPROFは1で決めた配列に沿った内容で文字そのもの(''でくくる)と
>文字ごとの文字幅のサイズを決めて初期化する。
> 3、改行させたい時はint line_wの値(この場合は60)を超えるようにCHARPROFの各
>int char_wの値(もしくは合計値)を決める。

私はコンパイルエラーにならないような例を示しただけなので、
それを元に推測するとおかしな方向に行ってしまいます。

print_string は単語の途中で改行されないように
英文を出力するプログラムということなので
*char_list は *str_list[] にどのような単語が
与えられても大丈夫なようにしておかなくてはなりません。
(私の例では This is a pen. は大丈夫ですが、
 I am a cat. は正しく動作しません。すなわち、
 *char_list は'T' や 'h' だけでなく 全ての文字の定義を
 与えなければなりません。)

また、改行は文章を長く(単語数を多く)すればいいものです。
60にしたのは改行する例のほうがいいかなと思っただけです。
line_wの値を変えて改行させるというのは本来の使い方では
ありません。

---
やま

0 new messages