ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュのコアダンプ 【core dump】について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
以下のソースにコアダンプ発生しました。原因が分かる方を教えていただけませんか?
int EditAbcSpace(int mode)
{

EXEC SQL BEGIN DECLARE SECTION;
VARCHAR v_ConsGName[7];
VARCHAR v_UserTSName[10];
struct
{
VARCHAR user_table_space[10];
VARCHAR abcno[7];
} rec_empuserts;
EXEC SQL END DECLARE SECTION;

memset(&v_ConsGName,'\0',sizeof(v_ConsGName));
memset(&v_UserTSName,'\0',sizeof(v_UserTSName));
memset(&rec_empuserts.user_table_space,'\0',sizeof(rec_empuserts.user_table_space));
memset(&rec_empuserts.abcno,'\0',sizeof(rec_empuserts.abcno));

if ( mode == 0 ) {

strcpy((char *)v_ConsGName.arr,c_ConsGName);
v_ConsGName.len = strlen((char *)v_ConsGName.arr);

EXEC SQL DECLARE cur_empuserts CURSOR FOR
SELECT USER_TABLE_SPACE,abcNO
FROM Abc_SPACE
WHERE abcNO = ' '
ORDER BY USER_TABLE_SPACE ASC
FOR UPDATE;

EXEC SQL OPEN cur_empuserts;

EXEC SQL FETCH cur_empuserts
INTO :v_UserTSName, :rec_empuserts.abcno;

EXEC SQL CLOSE cur_empuserts;
if( sqlca.sqlcode != 0){
return 3;
}

}
else if( mode == 1 ) {
strcpy((char *)v_ConsGName.arr," ");
v_ConsGName.len = strlen((char *)v_ConsGName.arr);
strcpy((char *)v_UserTSName.arr,c_UserTSName);
v_UserTSName.len = strlen((char *)v_UserTSName.arr);
}

#ifdef DEBUG
printf("update Abcaration ->%s\n",(char *)v_ConsGName.arr);
printf("update Tablespace ->%s\n",(char *)v_UserTSName.arr);
#endif

EXEC SQL
UPDATE Abc_SPACE SET abcNO = :v_ConsGName
WHERE USER_TABLE_SPACE = :v_UserTSName;

if( sqlca.sqlcode != 0){
#ifdef DEBUG
printf("sql error EditAbcSpace! ->%d\n",sqlca.sqlcode);
printf("%s\n",sqlca.sqlerrm.sqlerrmc);
#endif
return -1;
}

strcpy(c_UserTSName,(char *)v_UserTSName.arr);
strcpy(c_ConsGName,(char *)v_ConsGName.arr);

return 0;

}

コメント(14)

・丸投げコミュのほうが適任かと。
 http://mixi.jp/view_community.pl?id=602606
 むこうに立てたらこっちは削除してくださいね。
もうちょっと自分で原因究明しないと
守秘義務違反とかこわくね?
見当違いならゴメンナサイ
そもそも
&v_ConsGName
配列名の時点で先頭アドレスを指すのに
そこにアンパサンドつけちゃったらどうなるの?とか

VARCHARが純粋なc的にはどういう実装になってるのか?
(v_ConsGName.arrって何者?)とか

c_ConsGNameってどっから来たの?とか

このままではワケがわからなさすぎるんですよね。

これってPro*C、ですかね。ちょっと触った記憶がある。
/*
 これは、「原因が分かる方を教えていただけませんか?」という問いです。「原因が分かる方、教えていただけませんか?」でもなければ、「原因を教えていただけませんか?」でもありませぬ。

 cf.「プログラムは思った通りに動かない、書いたように動く」
*/
http://otndnld.oracle.co.jp/document/products/oracle10g/101/generic/B13723-07/ch08.htm#4
いろいろ不具合があるみたいです。
> Bug#2672965 動的4 SQLまたは他のカーソルを使用するProcアプリケーションでコア・ダンプが発生した
> Bug#2300956 カーソル変数を使用したSQL文のコア・ダンプが発生した
> Bug#2296498 プロンプトに対して対話形式でパスワードを入力すると、PROCでコア・ダンプが発生する場合がある

この不具合一覧を見ていると、書いたとおりにも動いてくれなさそう。
>8
同じなんですね。知らなかった。

3通りの書き方に関しては、&sは使いませんが
sと&s[0]はケースバイケースですよね。

意味合いとして、関数に渡すときなどに、配列全体ではなく
あくまで配列の先頭の要素だけを渡してるんだ、ってときは
&s[0]と書きます。

とはいえ、これだと「配列の途中から先の配列全体を渡してるんだ」
ってときは&s[n]と書くしかないので、この分類にあまり意味はなさそうですが。
char *s = "hoge";
int n;

ならば、

s[n]
n[s]
s + n
n + s

はどれも等しい。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。