C言語なら俺に聞け! Part 109
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNG質問する前には最低限検索を。
GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
C言語なら俺に聞け! Part 108
http://pc8.2ch.net/test/read.cgi/tech/1117690676/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0002デフォルトの名無しさん
2005/06/22(水) 19:27:530003デフォルトの名無しさん
2005/06/22(水) 19:48:51pthread_cleanup_push によってクリーンアップハンドラを登録します。
そのクリーンアップハンドラの中で、さらに pthread_cleanup_push を呼び出すことは許されるのでしょうか。
というのは、確保したリソースをクリーンアップハンドラで解放したいのですが、この解放処理に排他制御が
必要なのです。
排他処理には mutex を使っているのですが、pthread_mutex_lock の前に pthread_cleanup_push を行って
pthread_mutex_unlock を登録しているのです。
いかがなものでしょうか?
0004デフォルトの名無しさん
2005/06/22(水) 19:49:56>>1 標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
00053
2005/06/22(水) 19:57:59おっと、失礼しました。
と言っても、pthread はどこのスレに行けばいいんですかね?
開発環境は vi で書いて gcc でコンパイルしてるんですが、GNU ってことでもないし・・・
もしよろしければ、道案内していただけれると助かります。
00063
2005/06/22(水) 20:01:01マルチスレッドプログラミング相談室 その3
http://pc8.2ch.net/test/read.cgi/tech/1098268137/l50
を発見しました。
お騒がせしました。
0007デフォルトの名無しさん
2005/06/22(水) 21:10:32何故、質問誘導スレに行くと言う発想が出ないんだ?
0008デフォルトの名無しさん
2005/06/22(水) 22:17:590009デフォルトの名無しさん
2005/06/22(水) 22:47:590010デフォルトの名無しさん
2005/06/22(水) 22:56:030011デフォルトの名無しさん
2005/06/22(水) 22:57:58C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
何卒、ご指導の程よろしくお願いしますm(_ _)m
0012デフォルトの名無しさん
2005/06/22(水) 23:00:00始めたばかりの人間にはわからないような場面で役に立つ。
0013デフォルトの名無しさん
2005/06/22(水) 23:01:23ビットシフトするの時に役に立つ
0014デフォルトの名無しさん
2005/06/22(水) 23:20:100015デフォルトの名無しさん
2005/06/22(水) 23:20:42int main(void)
{
FILE *a;
int dir;
char fname[64],*str;
char buf0[256]="C:\\Documents and Settings\\Dai\\My Documents\\C\\";
char buf1[256]="C:\\Documents and Settings\\Dai\\My Documents\\C\\test\\";
printf("どこに作成しますか?\n(0:C 1:test)\n--->");
scanf("%d",&dir);
if(dir==0){
str=buf0;
}
else if(dir==1){
str=buf1;
}
printf("ファイル名を入力\n--->");
scanf("%s",fname);
strcat(str,fname);
if((a=fopen(str,"w"))==NULL){
printf("Can't open\n");
return 1;
}
fclose(a);
printf("終了〜( ´∀`)\n");
return 0;
}
0016デフォルトの名無しさん
2005/06/22(水) 23:30:11効率って、どんな点での話をしてるの?
バッファを 2個も取って、メモリの利用効率が悪いから改善したいって話?
それとも、もっとお手軽な関数は無いのかって話?
細かいことだけど、そのコード dir が 0 でも 1 でもなかったら str が不定になって、具合悪いよ。
0017デフォルトの名無しさん
2005/06/22(水) 23:31:11001815
2005/06/22(水) 23:36:03すいません。
・バッファをなるべく減らしたい
・ポインタよりも効率のいい方法はないか
・ifの部分をもっと改善できないか
という点について教えていただきたいのです
あくまで「ディレクトリ選択」が目的なので例外処理は後回しです。
0019デフォルトの名無しさん
2005/06/22(水) 23:38:46よぉ!大!久しぶりだな
0020デフォルトの名無しさん
2005/06/22(水) 23:42:03ディレクトリそのまま出さなきゃよかった。。。orz
0021デフォルトの名無しさん
2005/06/22(水) 23:47:30char buf[256] = "";
char *str = buf;
{
const char dirname = NULL;
do {
int dir;
printf("どこに作成しますか?\n(0:C 1:test)\n--->");
scanf("%d", &dir);
if(dir == 0) {
dirname = "C:\\Documents and Settings\\Dai\\My Documents\\C\\";
}
else if(dir == 1) {
dirname = "C:\\Documents and Settings\\Dai\\My Documents\\C\\test\\";
}
} while(dirname == NULL);
str += sprintf(str, "%s", dirname);
}
printf("ファイル名を入力\n--->");
scanf("%s",str);
{
FILE *a;
if((a = fopen(str, "w")) == NULL) {
printf("Can't open\n");
return 1;
}
fclose(a);
}
printf("終了〜( ´∀`)\n");
return 0;
002221
2005/06/22(水) 23:49:46× const char dirname = NULL;
○ const char *dirname = NULL;
002321
2005/06/22(水) 23:51:57× if((a = fopen(str, "w")) == NULL) {
○ if((a = fopen(buf, "w")) == NULL) {
ショボいソースなのに何度も書き込むハメになって・・・
もうダメだ・・・
0025デフォルトの名無しさん
2005/06/23(木) 00:02:08int main(void)
{
FILE *a;
int dir;
char fname[2][256]={"C:\\Documents and Settings\\Dai\\My Documents\\C\\",
"C:\\Documents and Settings\\Dai\\My Documents\\C\\test\\"};
printf("どこに作成しますか?\n(0:C 1:test)\n--->");
scanf("%d",&dir);
printf("ファイル名を入力\n--->");
scanf("%s",fname[dir] + strlen(fname[dir]));
if((a=fopen(fname[dir],"w"))==NULL){
printf("Can't open\n");
return 1;
}
fclose(a);
printf("終了〜( ´∀`)\n");
return 0;
}
0027デフォルトの名無しさん
2005/06/23(木) 00:11:32dirが配列の範囲内かどうかのチェックをしないと駄目だろ。
0029デフォルトの名無しさん
2005/06/23(木) 00:49:43バッファを減らすという課題がクリアできてないね。
行数が減ればOK?
003015
2005/06/23(木) 00:54:22>>21さんと>>25さんのプログラムを参考に、両立できるようがんばってみます
ちなみに私的には
バッファ<単純化(≒行数削減)
です
0031デフォルトの名無しさん
2005/06/23(木) 01:20:01char *dir_list[2]={
"C:\\hoge\\",
"C:\\hoge\\hage\\"
}
てな感じにしといて、
ファイル名と結合する為の専用バッファを1つ使うとメモリは減らせる
でも、文字列コピーになるので、処理は重くなる
0032デフォルトの名無しさん
2005/06/23(木) 01:39:34>>25 みたいに最初からバッファに展開しておくのだって、内部的にはバッファ上に文字列をせっせと作ってるわけだから、
そんなに軽い処理じゃないっしょ。
しかもデータ領域もコード領域も肥大化して、メモリ効率があんまり良くない。
処理系依存の話になるけど、linux に入ってた gcc で最初から文字列をバッファ上に展開しておく方のサンプルを
コンパイルしてアセンブラソースを吐かせてみると、オリジナルの文字列をデータ領域に持ちつつ、関数の入り口で
4バイト単位でスタック上に文字列をコピーがずらずら並んでて、さらにバッファの後ろを 0 でクリアする処理になってる。
mov がひたすら直列展開されてるからスピードは遅くはないんだろうけど。
0033デフォルトの名無しさん
2005/06/23(木) 01:47:10単にstaticな配列にしておけばいいだけ
しかしみみっちい、つかどうでもいい話しとるな。
003432
2005/06/23(木) 01:53:59そうすると
scanf("%s",fname[dir] + strlen(fname[dir]));
がいやな感じになりそう。
一度きりの実行ならいいけど、何度も呼ばれる関数だとダメだよね。
つか、みみっちい話なのには同意。
でも >>32 は
>でも、文字列コピーになるので、処理は重くなる
についてのコメント
0035デフォルトの名無しさん
2005/06/23(木) 01:55:090036デフォルトの名無しさん
2005/06/23(木) 06:37:01だったからね。
0037デフォルトの名無しさん
2005/06/23(木) 10:55:012つの文字列(20文字以内)をキーボードから入力し、1つの配列にし、
printf関数の%sによって表示するプログラムを作成しなさい。(ポインタを使うこと)
[実行例]
str1 : Big
str2 : City
str3 : BigCity
0038デフォルトの名無しさん
2005/06/23(木) 11:05:38>>1を読め
0039デフォルトの名無しさん
2005/06/23(木) 11:38:03#include <stdio.h>
int main()
{
printf("マルチ氏ね"
return 0;
}
0040デフォルトの名無しさん
2005/06/23(木) 11:40:11エラーが出るんですが。
0041デフォルトの名無しさん
2005/06/23(木) 11:55:32int a;
int形のaに整数型でaryを連結したものを入れるにはどうすればいいのでしょうか?
a = 1234
のようになるようにしたいんです。
0042デフォルトの名無しさん
2005/06/23(木) 12:03:470043デフォルトの名無しさん
2005/06/23(木) 12:28:29なるほど、ありがとうございました。
0044デフォルトの名無しさん
2005/06/23(木) 15:15:43for(i=0; i<4; x=x*10+ary[i++]);
0045デフォルトの名無しさん
2005/06/23(木) 16:33:360046デフォルトの名無しさん
2005/06/23(木) 17:19:56●
●
●
●
とデータを一度書き込んだ後
●○
●○
●○
●○
と横にデータをつけ加えていく方法はあるのでしょうか?
0047デフォルトの名無しさん
2005/06/23(木) 17:22:13何がわからないんだ?ファイルに○を挿入したいの?
0048デフォルトの名無しさん
2005/06/23(木) 17:24:17読んで書いていくしかないと思うよ
最初から○分の隙間をあけてあればよかったけど
0049デフォルトの名無しさん
2005/06/23(木) 19:12:20for(;;)
というのが出てきたのですが、これは何なのでしょうか?
0050デフォルトの名無しさん
2005/06/23(木) 19:15:07永久ループ
0051デフォルトの名無しさん
2005/06/23(木) 19:17:09なるほど、ありがとうございました。
0052デフォルトの名無しさん
2005/06/23(木) 19:28:143.23456,2.32,3.2213
2.322,2.2,3.3333
2.33,2.1,11.123
たとえばこの小数点を含むcsvのデータを
float型の二次配列に代入したいということです
float[0][0]には3.23546が
float[2][1]には2.2が入ります。
0053デフォルトの名無しさん
2005/06/23(木) 19:30:22scanf("%f,%f,%f"
0054デフォルトの名無しさん
2005/06/23(木) 19:31:41数字のデータなんですが、1行1万列ぐらいで、20行ぐらいあるんです。
>>48
一度、配列に全部入れてから一気に書き
出そうとも思ったんですが、データ数があまりにも多くて・・・
0055デフォルトの名無しさん
2005/06/23(木) 19:35:59どうしようもない
0056デフォルトの名無しさん
2005/06/23(木) 19:36:18あのな、「方法はあるのでしょうか? 」という質問だった筈だろ。
こんな場所でもちゃんとした回答が欲しいなら、ちゃんとした質問の仕方しろ。
0057デフォルトの名無しさん
2005/06/23(木) 19:41:48コンピュータにとっては、一万くらい大した量じゃないだろ。
0058デフォルトの名無しさん
2005/06/23(木) 19:44:260059デフォルトの名無しさん
2005/06/23(木) 19:45:150060デフォルトの名無しさん
2005/06/23(木) 19:47:51質問の意味が分からんというか、何を期待してんの?
一意に消されるとは胃炎。つか普通消されるように書かねーよ。
returnの後とかな。
0061デフォルトの名無しさん
2005/06/23(木) 19:49:02int a[100];
この場合、 「a」でポインタを取得できますが、このときのポインタの型は
int (*)[100] ですか?
よく、
int *p = a;
とやりますが、これは、int(*)[100] が、 int*へ、暗黙の型変換されてい
ると理解すればよいのでしょうか?
0062デフォルトの名無しさん
2005/06/23(木) 19:58:48そうではない。
単純にint*になる。
int a[100][100]だと int (*)[100]になる。
単純に2次以上だと配列のサイズが型情報に入ると思えばよろしい。
0063デフォルトの名無しさん
2005/06/23(木) 20:02:37scanfはファイルからカンマ区切りで読み込む機能がついているのでしょうか?
よくわかりません。
0064デフォルトの名無しさん
2005/06/23(木) 20:04:04そーゆーのはmanとかgoogleとかで調べようね。
0065デフォルトの名無しさん
2005/06/23(木) 20:25:36テンポラリファイルを使うってのはどうよ?
0066デフォルトの名無しさん
2005/06/23(木) 20:35:28int newdata[]
に追加データが入っているものとする。
i = 0;
while ((c = getc(reader)) != EOF) {
if (c != '\n') putc(c, writer);
else {
printf(",%d\n", newdata[i++];
}
}
こんな感じでどうだ。無駄なメモリは一切食わん。
0067デフォルトの名無しさん
2005/06/23(木) 20:35:57#include<stdlib.h>
#include<string.h>
int main(void)
{
char buf[1024];
int len;
float data;
float num[2];
int i;
FILE *fp = fopen("test.csv", "r");
if(fp == NULL){
printf("読み取り失敗です\n");
exit(2);
}
fgets(buf, 1024, fp);
printf("buf=%s\n", buf);
len = strlen(buf);
data = atof(buf);
printf("data=%.10f\n", data);
fscanf(fp, "%f,%f,%f", &num[0], &num[1], &num[2]);
for(i = 0; i < 3; i++)
printf("num[i]=%f\n", num[i]);
printf("test\n");
fclose(fp);
return 0;
}
0068デフォルトの名無しさん
2005/06/23(木) 20:36:00fprintf(writer, ",%d\n", newdata[i++]);
だな。
0069デフォルトの名無しさん
2005/06/23(木) 20:36:09しかし、これからどうやって変数に代入したらいいのかわかりません。
3.23456,2.32,3.2213
このデータからどうやってカンマ区切りの少数を3つ取り出せばいいのか…。
0070デフォルトの名無しさん
2005/06/23(木) 20:36:350071デフォルトの名無しさん
2005/06/23(木) 20:53:59sscanf("3.23456, 2.32, 3.2213\n", " %f, %f, %f ", &boke[0], &boke[1], &boke[2]);
0072デフォルトの名無しさん
2005/06/23(木) 21:19:52int main(void)
{
float boke[2];
sscanf("3.23456, 2.32, 3.2213\n", " %f, %f, %f ", &boke[0], &boke[1], &boke[2]);
return 0;
}
これを実行したらエラーR6002
floating-point support not loaded
が出て動きません。
今までこんなエラー出たこと無いのですが…。
0073デフォルトの名無しさん
2005/06/23(木) 21:36:05int main(void)
{
float boke[2];
sscanf("3.23456, 2.32, 3.2213\n", " %f, %f, %f ", &boke[0], &boke[1], &boke[2]);
printf("boke[1]=%f boke[2]=%f boke[3]=%f", boke[0], boke[1], boke[2]);
return 0;
}
printfを用いて値を表示させるようにしたらエラーは出なくなるけど強制終了…。
なんでだろう…?
0074デフォルトの名無しさん
2005/06/23(木) 21:36:15見たことないエラーが出たんならぐぐれよ。
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/R6002.asp
あと、float boke[3]; な。
0075デフォルトの名無しさん
2005/06/23(木) 21:40:52http://www.catnet.ne.jp/kouno/c_faq/c14.html#13
0076デフォルトの名無しさん
2005/06/23(木) 23:31:43msdnが入っているのですが、読んでも専門用語だらけでなかなか理解できないのが現状です。
ヘルプを読解できるようになるためのサイトなどはないでしょうか?
>>75
ライブラリールーチンが無いのはわかったのですが
そもそもライブラリルーチンというものが何かわかりません…。
0077デフォルトの名無しさん
2005/06/23(木) 23:36:55マジレスするならば、
馬鹿は去れ。馬の耳に念仏。
0078デフォルトの名無しさん
2005/06/23(木) 23:37:57ライブラリルーチンとはようするにprintfとかscanfの定義(実体)だと思えばいい。
ところで専門用語は日本語にしてもカタカナにしただけになるから、
俺は専門用語だらけの英文は逆に普通の英文より読みやすい。
http://www.microsoft.com/japan/msdn/library/ja/vccore/html/R6002.asp?frame=true
0079デフォルトの名無しさん
2005/06/23(木) 23:45:38すみません。一日7時間程度やってるのに全然身につきません。
馬鹿なのはわかってます。
でも、やり始めたのだからある程度のレベルまでは行きたいんです。
>>78
定義ってヘッダファイルに記載されているやつじゃないんですか?
#include<stdio.h>で完了しているのでは。
0080デフォルトの名無しさん
2005/06/23(木) 23:47:05最悪だな
0081デフォルトの名無しさん
2005/06/23(木) 23:55:44基礎からキチンと勉強する事をおすすめする
今までにでた単語を検索するだけで勉強になるぞ
0082デフォルトの名無しさん
2005/06/23(木) 23:58:11そうですね。とりあえず検索のスキルを高めてみたいと思います。
本は図書館に行っていろいろ読んでいるのですが
難しいのばっかりでなかなか身につきません。
0083デフォルトの名無しさん
2005/06/23(木) 23:58:36#include<stdio.h>の中に書いてあるのは関数の宣言。
0084デフォルトの名無しさん
2005/06/24(金) 00:12:12.┌━┐ ┌━┐
┃┌╋──╋┐┃
└╋┘ └╋┘
┃ ・ ・ ┃ ┌━━┐
●━╋┐ ┌╂━━━━╂┐ ┃
└━┷┴━━╂┘ └╋━┘
同じスレにはコピペ ┌╋┐ ┌╋┐
できるけど、違う ┃└╋╋━━╋╋┘┃
スレにはコピペでき ┃ ┃┃ ┃┃ ┃
ない不思議コピペ ┃ ┃┃ ┃┃ ┃
└━┘┘ └└━┘
0085デフォルトの名無しさん
2005/06/24(金) 00:12:43おまえが作ったプログラムから呼び出される printf だとか scanf だとかその他もろもろの関数ってのは、
その中身(=実体)を誰かがコーディングしておいてくれてるわけ。
おまえが作ったプログラムをコンパイルして実行ファイルを作ると、お前の作ったプログラムに
そのだれかが作っておいてくれたプログラムコードがくっつけられるわけ。
そのくっつけられる printf だとか scanf だとかの実体のことが、ライブラリルーチン。
ちなみに、そのくっつける処理のことをリンク、くっつけるプログラムのことをリンカって言う。
printf だとか scanf だとかは、おそらくおまえが書こうとしても書けないくらい複雑なルーチンで、マジメに作ると
そのプログラムサイズもそこそこ大きいものとなる。
そこで、一部機能を省略して、プログラムサイズを抑えた printf や scanf がある。
ここで省略された機能が、小数に関する処理。
%f だとかの小数に関することが指定されると、エラーを起こして終了するように作られてる。
おまえの環境では、普通にコンパイルして実行ファイルを作ると、この省略版のライブラリが使われるんだろ。
だから、おまえが小数を使ったプログラムを作ったならば、省略版じゃないほうのライブラリをリンクしてもらうよう、
コンパイルのときにオプションをつけて指定しなくちゃいけない。
その方法は、おまえの環境のマニュアルなりなんなりを読むと書いてあるだろう。
0086ビル・ジョブス
2005/06/24(金) 00:16:02リエントラントなprintf()を制御系用途に持ってたりもするがな。
0087デフォルトの名無しさん
2005/06/24(金) 00:16:33そんな難しい事言われても、さっぱりわかりません。
0088デフォルトの名無しさん
2005/06/24(金) 00:24:56やる気はあるようだね。
若ければ(小〜高1程度)なら可能性はあるが、大学生以上だとしたらダメぽ。
オプションで/FPi87というのを有効にする必要があるってこと。
プロジェクト設定のどっかに「浮動小数点を使う」とかないかね。
0089デフォルトの名無しさん
2005/06/24(金) 00:28:22http://www.xilinx.co.jp/xlnx/xil_ans_display.jsp?iLanguageID=2&getPagePath=19592&BV_SessionID=@@@@2092204721.1119540378@@@@&BV_EngineID=ccceaddelljelgdcefeceihdffhdfjf.0
0090デフォルトの名無しさん
2005/06/24(金) 00:28:32>>87は特殊な環境orターゲットでやってんのか?
x87が使えない>>87って、切ないな。
0091デフォルトの名無しさん
2005/06/24(金) 00:29:260092デフォルトの名無しさん
2005/06/24(金) 00:30:23http://www.sp.ee.musashi-tech.ac.jp/tk/class/pc/VC_BUG.html
0093デフォルトの名無しさん
2005/06/24(金) 00:31:54アホだ。finitされてないヨおじさん。
0094デフォルトの名無しさん
2005/06/24(金) 00:36:14詳しい説明ありがとうございます。
なるほど、思った以上に複雑な構成になっているのですね…。
リンカというのは聞いたことがあります。
MSDNのライブラリ見て調べてみます。
>>87
中々わかりませんよね。一緒にがんばりますか。
>>88
大学4年です。研究で必要になったのでやり始めました。
…もう遅いですね。
オプションってすごい量あるんですね。
全部見ていってみます。
>>90
家ではVisualC++ 6.0ですが
学校ではVisual Studio .NET 2003を使っています。
ちなみに、R6002のエラーはどちらでも出ます。
0095デフォルトの名無しさん
2005/06/24(金) 01:14:55そのファイル(data.txt)の中身としては
1 2 3 4
5 6 7
8 9 10 11 12
13 14
のように1行目は4列の整数データがあるのに
2行目は3列のデータ、3行目は5列のデータと、
行数によってまちまちの列数のデータがそれぞれスペースで区切られています。
このようなファイルから3列目のデータだけを
配列に格納していきたい場合はどのようにすればいいのでしょうか?
0096デフォルトの名無しさん
2005/06/24(金) 01:20:09while (fgets(buf, sizeof(buf), fp)) {
sscanf(buf, "%*d%*d%d", array[idx++]);
}
0097デフォルトの名無しさん
2005/06/24(金) 01:38:14isalphaはint型じゃないと無理なんで…
0098デフォルトの名無しさん
2005/06/24(金) 01:40:25isalpha
0099デフォルトの名無しさん
2005/06/24(金) 01:42:42if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')){
/* alpha */
}
それかintにコピして比較
010061
2005/06/24(金) 01:43:39isalphaの引数がintなのはEOFが引数としてきた時のこをを考慮してだ。
別にcharのをキャストして渡しても問題ない。
明示的にキャストする必要もないが。
0101デフォルトの名無しさん
2005/06/24(金) 01:48:17float boke[2] = {0};
int main(void)
{
boke[1] = 1.0;//浮動小数点を使ってやる。
sscanf("3.23456, 2.32, 3.2213\n", " %f, %f, %f ", &boke[0], &boke[1], &boke[2]);
return 0;
}
いろいろ検索してみると浮動小数点を明示的に使ってやら無いとだめみたいですね。
こうやるとエラーが出ませんでした。
しかし
#include<stdio.h>
int main(void)
{
float boke[2] = {0};
boke[1] = 1.0;
sscanf("3.23456, 2.32, 3.2213\n", " %f, %f, %f ", &boke[0], &boke[1], &boke[2]);
return 0;
}
こうなるとコンソールがクラッシュします。
どちらも明示的に使っているはずなのになぜ?
0102デフォルトの名無しさん
2005/06/24(金) 01:48:46typedef した型名がかぶってしまった場合回避する方法はありますか?
0103デフォルトの名無しさん
2005/06/24(金) 01:52:17http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/599.txt
↑で>>96さんのを参考に作ってみましたがエラーがでます;;
どこがおかしいのでしょう???
PS
data.txtの中身はスペースで区切ったはずですが、
tabに変換されてしまったようですので虫してください。
0104デフォルトの名無しさん
2005/06/24(金) 01:54:070105デフォルトの名無しさん
2005/06/24(金) 01:55:53該当インクルードファイルをインクルードしない。
或いは問題のキーワードをマクロで置き換えてtypedefさせない。
#define → #include → #undef
0106デフォルトの名無しさん
2005/06/24(金) 01:55:57>>73
0107デフォルトの名無しさん
2005/06/24(金) 01:56:27"0x0040117e" の命令が "0x01168124" のメモリを参照しました。メモリが "read" になることはできませんでした。
プログラムを終了するには [OK] をクリックしてください
プログラムをデバッグするには [キャンセル] をクリックしてください
コンパイルはできるみたいなんですが実行すると上のメッセ-ジがでます。
0108デフォルトの名無しさん
2005/06/24(金) 01:56:52boke[2] は boke[0], boke[1] の二つしかないよ。
確保される場所が違うから片方で落ちたんだろうね。
>>102
無いかな。
とりあえず思いつかない。
#defineで誤魔化すようなことはできるけど。
>>104
sscanf(buf, "%*d%*d%d", & array[idx++]);
じゃないかな。
0109デフォルトの名無しさん
2005/06/24(金) 01:56:55idxが初期化されてないよん。
0110デフォルトの名無しさん
2005/06/24(金) 01:57:52無い。
ダブらない名前をつけるしかない。
011197
2005/06/24(金) 01:58:17下みたいなプログラムを作ったんですけど、実行しようとすると強制終了してしまいます。
どこが悪いのか教えてください
#include<stdio.h>
int buf_check(int buf[],int str);
main(){
char buf[64];
int str;
printf("文字列を入力してください\n");
scanf("%s",buf);
str=strlen(buf);
if(buf_check(buf,str)==0){
printf("文字列の中にアルファベット以外の文字があります\n");
}
}
int buf_check(int buf[],int str){
int i;
for(i=0;i<=str;i++){
if(isalpha(buf[i])==0)
return 0;
break;
}
}
0112デフォルトの名無しさん
2005/06/24(金) 01:58:56なるほど。やってみます
ありがとうございました
0113デフォルトの名無しさん
2005/06/24(金) 02:00:47ありがとうございます!!
できました!
0114デフォルトの名無しさん
2005/06/24(金) 02:01:43int buf_check(char buf[], int str)
もう少し正しく書けば
int bun_check(const char buf[], int str)
0116デフォルトの名無しさん
2005/06/24(金) 02:01:56なるほど、存在しないboke[2]に値を入れたから落ちたんですね。
float boke[3] = {0};
にすれば解決できました。
しかし、グローバル変数にしたら存在しないboke[2]に値入れてもエラー出ないんですね。
バグの原因になりそうです。
0117デフォルトの名無しさん
2005/06/24(金) 02:04:30%*d は勉強になりました。
ありがとうございました!
0118デフォルトの名無しさん
2005/06/24(金) 02:04:45エラーが出ないのはたまたま。
意図しないメモリ領域を書き換えていることには間違いなくて、どんな結果を起こすか想像もつかない。
0119デフォルトの名無しさん
2005/06/24(金) 02:05:33なるほど。気をつけないといけませんね。
0120114
2005/06/24(金) 02:06:47でも。書き直して英字の文字列を入力しても文字列の中に
アルファベット以外の文字があるといわれてしまいます…
#include<stdio.h>
int buf_check(const char buf[],int str);
main(){
char buf[64];
int str;
printf("文字列を入力してください\n");
scanf("%s",buf);
str=strlen(buf);
if(buf_check(buf,str)==0){
printf("文字列の中にアルファベット以外の文字があります\n");
}
}
int buf_check(const char buf[],int str){
int i;
for(i=0;i<=str;i++){
if(isalpha(buf[i])==0)
return 0;
}
}
0121デフォルトの名無しさん
2005/06/24(金) 02:09:15それコンパイル通る?
全部がアルファベットだった場合、その関数は return 無しに終了しない?
0122121
2005/06/24(金) 02:12:32へぇ
0123デフォルトの名無しさん
2005/06/24(金) 02:14:43forの条件が間違ってる
最後に非0をreturnしてない
0124120
2005/06/24(金) 02:19:06そういえばfor文の条件はi<=strじゃなくてi<strですね
書き直したら正しく動きました
0125デフォルトの名無しさん
2005/06/24(金) 02:21:55問1
buf_check の第一引数に、const が付いている理由は?
先生にツッこまれる前に考えておいた方がいいよ
0126125
2005/06/24(金) 02:31:490127デフォルトの名無しさん
2005/06/24(金) 02:53:33#include<stdlib.h>
#include<conio.h>
int main(void)
{
float boke[1000][8] = {0.0};
char data[1024];
int i = 0;
FILE *fp;
if ((fp = fopen("test.csv", "r")) == NULL){
printf("Could not open file");
exit(-2);
}
while ((fgets(data, 1024, fp)) != NULL){
sscanf(data, " %f, %f, %f, %f, %f, %f, %f, %f "
,&boke[i][0], &boke[i][1], &boke[i][2], &boke[i][3],
&boke[i][4], &boke[i][5], &boke[i][6], &boke[i][7]);
printf("boke[%d][0]=%f \nboke[%d][1]=%f \nboke[%d][2]=%f \nboke[%d][3]=%f \nboke[%d][4]=%f\n"
"boke[%d][5]=%f \nboke[%d][6]=%f \nboke[%d][7]=%f\n",
i, boke[i][0], i, boke[i][1], i, boke[i][2], i, boke[i][3],
i, boke[i][4], i, boke[i][5], i, boke[i][6], i, boke[i][7]);
i++;
}
fclose(fp);
return 0;
}
やっとこさCSVファイルからデータを読み込むプログラムのベータ版ができました。
しかし、fgetsの戻り値がなぜかファイルの終わりになってもNULLになりません。
ループから抜けられないでスキャンし続けてエラーになります。
0128デフォルトの名無しさん
2005/06/24(金) 03:00:59たぶん、最後に改行だけがあるんじゃないかな。
sscanfはスキャンに成功したフォーマットの個数を返すから、
それを拾って判定するべきかも。
0129デフォルトの名無しさん
2005/06/24(金) 03:19:41fgets(data, 1024, fp);
if ( flag == EOF)
break;
flag = sscanf(data, " %f, %f, %f, %f, %f, %f, %f, %f "
,&boke[i][0], &boke[i][1], &boke[i][2], &boke[i][3],
&boke[i][4], &boke[i][5], &boke[i][6], &boke[i][7]);
printf("boke[%d][0]=%f \nboke[%d][1]=%f \nboke[%d][2]=%f \nboke[%d][3]=%f \nboke[%d][4]=%f\n"
"boke[%d][5]=%f \nboke[%d][6]=%f \nboke[%d][7]=%f\n",
i, boke[i][0], i, boke[i][1], i, boke[i][2], i, boke[i][3],
i, boke[i][4], i, boke[i][5], i, boke[i][6], i, boke[i][7]);
i++;
}
return 0;
}
sscanfならEOFがきちんと返ってきて正しく終了できました。ありがとうございました。
今後の課題は要素の数(この場合は8)が変わってもそれに応じて
変数の値を確保し、値を読むプログラムに完成度を高めて生きたいと思います。
bokeをそのまま使ったのはなんとなく語呂がよかったからです(苦笑
0130デフォルトの名無しさん
2005/06/24(金) 03:21:09出来てきたね。
上達したかったら、例えばcsvの1列が100個ある場合とか、考えてみるといい。
いまのやり方だと無理がある。
プログラミングは常に「楽しよう」と思わないとダメ。
0131デフォルトの名無しさん
2005/06/24(金) 03:25:39なるほど、プログラミングの負担が軽くなって楽になるように努力しろということですね。
なるべくコンパクトにまとまるように考えてみます。
0132デフォルトの名無しさん
2005/06/24(金) 03:34:320133デフォルトの名無しさん
2005/06/24(金) 04:49:13簡単な方法はありますか?
0134デフォルトの名無しさん
2005/06/24(金) 05:54:160135デフォルトの名無しさん
2005/06/24(金) 08:19:00ちょっと待て。sscanf()の戻り値をチェックしたらその後fgets()する必要はないだろ。
0136デフォルトの名無しさん
2005/06/24(金) 08:37:07次のような感じでいいんでしょうか?
ポインタの指し示す先の値が volatile のとき
volatile char *p;
ポインタの値が volatile のとき
char * volatile p;
そして、
volatile char **p;
のときは、どこが volatile になるでしょうか?
0137デフォルトの名無しさん
2005/06/24(金) 08:44:29volatile char は char volatileと同じ。
修飾される。
0138136
2005/06/24(金) 09:05:58修飾されるか否かではなくて、どこが修飾されるかの問題なんです。
volatile char **p; … 1
char * volatile *p; … 2
char ** volatile p; … 3
みたいな書き方をしたとき、
3 は p そのものが、2 は *p が、1 は **p が volatile ってことでいいんですよね?
ようするに、volatile なメモリ領域を指し示すポインタの配列ならば 1 を、
volatile じゃないメモリ領域を指し示す配列の中身が volatile ならば 2 を、
volatile じゃないメモリ領域を指し示す volatile じゃない配列を指し示す volatile なポインタならば 3 を、
ということでいいんでしょうか?
0139136
2005/06/24(金) 09:12:11void main(int argc, char **argv)
と書いたりしますが、より適切には
void main(int argc, const char * const *argv)
になったりしますか?
また、
void main(int argc, char argv[][])
の書き方を同様に修飾するなら、どんな書き方になるんでしょうか?
0140デフォルトの名無しさん
2005/06/24(金) 09:30:17strcat() は自動的に領域を割り当てないということで、
以下のようなコードを書いて見ました。
これって、
1. C言語的に間違ってないでしょうか?
2. 普通はどうやるのが適切なんでしょう?
みんなが普通にやりそうなことなので、
サンプルを探したのですが、
あらかじめ領域を確保してるやりかたしか
みつけられませんでした。
ソースは後述 ↓
0141140
2005/06/24(金) 09:31:04#include <stdlib.h>
#include <string.h>
char* stringCatEx(char *pBaseString, char *pAddString)
{
if (pBaseString == NULL) {
pBaseString = (char *)calloc(1, strlen(pAddString) + 1);
} else {
pBaseString = (char *)realloc(pBaseString, strlen(pBaseString) + strlen(pAddString) + 1);
}
pBaseString = strcat(pBaseString, pAddString);
return pBaseString;
}
void endStringCatEx(char *pString)
{
free(pString);
pString = NULL;
}
int main()
{
char *pString = NULL;
pString = stringCatEx(pString, "aaaaa ");
pString = stringCatEx(pString, "bbbb\n");
pString = stringCatEx(pString, "ccc ddd");
pString = stringCatEx(pString, "\neee");
printf("%s\n", pString);
endStringCatEx(pString);
return 0;
}
0142137
2005/06/24(金) 09:39:06複合宣言子パーサを書いてみるとよくと分かると思う。
簡略して言うと、宣言は識別子を基点に右を優先して解析していく。
宣言は左側にあるから、修飾は後にされるわけ。
> void main(int argc, const char * const *argv)
そうだね、適切かもしれないけど、慣用と違うってことで違和感あるかも。
ポインタ使う時にわざわざconstポインタにしないといけないしね(キャストしてもいいが)。
> void main(int argc, char argv[][])
*と[]は等価ではないよ。↑は宣言としてはエラーになる。
[]はあくまでサイズ未定義の配列(の先頭アドレス)だから。
>>140 - 141
どうだろう、微妙だなぁ。
mallocされたバッファが前提条件になるし、
stringCatExではそれをチェックする手立てがない。
C言語的には間違ってないと思うけど、endStringCatExのpString = NULL; は意味無い。
効率上問題なければこれでいいと思う。
ポインタだけチェインしてって、あとで一気に割り当てて連結したり、
普通にオーバーしないくらいのバッファを予め割り当てたり、
いろいろやり方あると思うけどね。
0143137
2005/06/24(金) 09:41:14この言い方は撤回。
「宣言が左側にあれば、修飾は後にされるわけ。」というべきだったか。
0144デフォルトの名無しさん
2005/06/24(金) 09:45:24第一引数の領域は malloc なり calloc なりでアロケートされるメモリ領域っていう前提でいいのかな?
それならそれでOKだと思うけど、後でその文字列領域をちゃんと free しないとだめだよ。
そして、もし間違って上記以外のポインタを渡してしまった場合、この関数がどう動作するか予測できなくなるよ。
0145140
2005/06/24(金) 09:48:04お返事ありがとうございます。
C言語になかなか慣れないもんで、こんなレベルのソースです(はずかしや)
ポインタのチェーンで一気に割り当てってなんかよさげな気がしてきました。
ちょっとサンプルでも作ってみようかと思います。(わかるかなぁ)
0146144
2005/06/24(金) 09:50:00ただ、endStringCatEx の中で pString = NULL; とやってるけど、呼び出しもとの pString が更新されるわけではないから
そこに注意。
呼び出しもとの pString を更新したいならば、
void endStringCatEx(char **pString)
{
if(pString != NULL) {
if(*pString != NULL) free(*pString);
*pString = NULL;
}
}
にして、呼び出し元もそれにあわせて変更、かな。
0147デフォルトの名無しさん
2005/06/24(金) 09:54:14argvはアプリケーションに向けて可変の領域が割り当てられていることになっているので
constではない。実際、書き換えても不都合はない。
0148144
2005/06/24(金) 09:55:12if(pString != NULL && *pString != NULL) { ・・・ }
みたいな書き方って、意図した通りに動くことが保証される?
この if だと、pString != NULL が成立しなかった時点で *pString != NULL は評価されちゃいけないし、
何らかの都合で pString != NULL よりも先に *pString != NULL が評価されてもいけないよね。
この辺のことは最適化と関係しそうだけど、C言語としての規定ではどんな感じなんでしょう?
自分はこういうときには if を 2段にして書いてたけど。
0149デフォルトの名無しさん
2005/06/24(金) 09:58:17普通は、そこまで凝ったことして非効率にするより、個別に意識して書くことを選択するわけで……
そうそう、calloc()/realloc()の戻り値のチェックも忘れないようにね。
0150デフォルトの名無しさん
2005/06/24(金) 09:59:28呼び出した側がどんなメモリ領域を渡したかではなくて、その関数がそのメモリ領域をどう処理するのかで
プロトタイプが決まるんじゃないいの?
const * な関数に const じゃない領域を渡しても問題無いし、キャストもいらないよね?
いや、main の由緒正しいプロトタイプが何かって問題はさておいて。
0151デフォルトの名無しさん
2005/06/24(金) 10:01:29きちんと仕様くらい自分で調べられるようになろう。
&&と||については、只の演算子ではなく評価をショートカットできることが規定されているので大丈夫。
0152140
2005/06/24(金) 10:06:07「個別に意識して書くこと」といいますと・・・(^^;
すいません。どんなことなのかわからないです・・・。
すっごく効率悪そうなので、
なんかいい方法はないのかなぁとは思ってるんですが。
なにせC言語の世界がまったく見えてないもんで・・・。
1. 最初はどれぐらいの情報(最終的なstringの長さ)になるかわからない。
2. stringは次々と追加していきたい。
というのがやりたいことなんです。
えーと、たとえばHTMLをC言語で動的に組み上げるみたいな。
0153137
2005/06/24(金) 10:11:43言っといてアレなんだけど、
「ポインタのチェーンで一気に割り当て」ってのも問題が無いわけじゃない。
alloc系呼び出し回数は少ないけど、例えばmallocで割り当てた領域の文字列を
チェインされて、どっか別の所で開放されてしまったら、
チェインを連結する時にメモリアクセス違反になるだろうね。
140さんのやつも、生でchar*を使うから問題があるんで、
うまくカプセル化すればそこんとこは問題ないと思うよ。
>>147
「問題ある」とは言ってないぞ。漏れは好きくないが。
#argvについて、もう一つ言えば、argv[argc」== NULLも保証されてる。
#ターミネートされてるんなら、argcは何のために・・・?
0154148
2005/06/24(金) 10:12:25ありがとう。
調べたいのはやまやまなのですが、その記述にどのような手順でたどり着くのか、キッカケが無いと見当を
つけるのもなかなか難しくて・・・
あつかましいながら改めて確認なのですが、式が && の左側から評価されることも保証されてるってことでOKですか?
つまりは、演算子の優先順位と結合規則順に式が評価されることは保証されるのか?と言うことなのですが。
0155154
2005/06/24(金) 10:16:33むしろ == なんかの方が気になってきました。
個別の回答よりも、もしよろしければ仕様へのポインタを示していただけると大助かりです。
0156デフォルトの名無しさん
2005/06/24(金) 10:24:25マクロの復習をかねようということで,マクロ関数を用いて
以下のソースを書いてみたのですが
57行目で構造体の要素がどれも定義されていないと怒られます.
いろいろと調べ,考えたのですが解決できませんでした.
どなたか何が原因か教えてください!!
ソース
↓
0157デフォルトの名無しさん
2005/06/24(金) 10:25:550158136=138
2005/06/24(金) 10:26:15うーん・・・
その言い回しを理解するのにはちょっと時間がかかりそうです。
宣言が左にあれば、修飾は後ということは、
char * volatile *p;
は、volatile はその左の char * を修飾しているということになりますか?
そうだとすれば、char * 自体が volatile で、p はそのポインタを指し示すポインタ、ということになるわけですか。
じゃあ
volatile char **p;
と
char ** volatile p;
の読み方はどんな感じになるんでしょうか?
0159デフォルトの名無しさん
2005/06/24(金) 10:26:22#define hantei 0.0001
#define ABS(num) ((num)>=0 ? (num) : -(num))
#define Odd_Even( c ) {\
c->odd = 0;\
c->even = 0;\
c->y0 = (*f)(a);\
c->y2n = (*f)(a + n * h);\
for(i = 1;i < n;i+=2) {\
c->odd+=(*f)(a + i * h);\
}\
for(i = 2;i < n - 1; i+=2) {\
c->even+=(*f)(a + i * h);\
}\
}
#define total(c) (( c>-y0 + c>-y2n + 4.0 * (c>-odd)+ 2.0 *( c>-even)) * h / 3.0)
double myfunction( double );
double simpson(double, double, double (*) (double));
0160159続き
2005/06/24(金) 10:27:10double y0;
double y2n;
double odd;
double even;
}menseki;
main() {
double a, b;
scanf("%lf", &a);
scanf("%lf", &b);
simpson( a, b, *myfunction);
}
double myfunction(double x) {
return(1.0/x);
}
0161156
2005/06/24(金) 10:28:33159と160がソースですので
よろしくお願いします
0162デフォルトの名無しさん
2005/06/24(金) 10:30:53malloc なんかは呼出回数が少ないに越したことは無いんだけど、realloc は多少何度も呼び出しても
差し支えないんじゃないかな。
できるだけコストがかからないよう、メモリ領域が移動しないように再割り当てしてくれてるんだから、
ユーザー側で実装を複雑にするよりも、そういう機能を積極的に活用した方がメリットが多そう。
0163デフォルトの名無しさん
2005/06/24(金) 10:32:24問題の57行目ってどこよ。
0164156
2005/06/24(金) 11:05:48わかりづらくて申し訳ありません.
S2 = total(men);
としてマクロ関数を呼び出しているところです.
なお,ここをコメントアウトすると今度はこの下で
同じマクロ関数を呼び出すところで同じエラーがでるので
この関数に問題があるのではとおもっています...
よろしくお願いします
0165デフォルトの名無しさん
2005/06/24(金) 11:21:151. mem ではなくて &men を渡すべきじゃないか
2. マクロの定義において、c を (c) に置き換えるべきじゃないか
0166315
2005/06/24(金) 11:37:56double simpson(double a, double b , double(*f) (double))
{
int n=2;
int i;
double h;
double S1 = 0, S2 = 0;
menseki *men;
men = (menseki *) malloc(sizeof(menseki));
h=(b-a)/(double)2;
Odd_Even(men);
S2 = total(men);
while( ABS(S2 - S1) >= hantei) {
n*=2;
h/=2;
Odd_Even(men);
S1 = S2;
S2 = total(men);
}
printf("Intergral : %lf\n",S2);
free(men);
}
0167315
2005/06/24(金) 11:39:17ごめんなさい
肝心の部分のソースを忘れてましたorg
マクロの部分を書き換えて試してみます!
0168ktc
2005/06/24(金) 11:41:57問3. 入力された文字列の文字を逆から表示するプログラムを関数を使って作成せよ。
やってください。お願いします。
0169デフォルトの名無しさん
2005/06/24(金) 11:54:48>>1
> ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
死んでください。
0170ktc
2005/06/24(金) 12:04:090171143
2005/06/24(金) 12:14:49ここで複合宣言子の規則について詳細に書くつもりはないが、
char * volatile *p;
は、左の char * を修飾している。そりゃそうだ。
volatile char **p はcharを修飾している。
char ** volatile p はchar**を修飾している。
パース過程はこんな感じかな。
pは・・・
pはvolatile修飾された・・・
pはvolatile修飾された・・・へのポインタである
pはvolatile修飾された・・・へのポインタへのポインタである
pはvolatile修飾されたcharへのポインタへのポインタである
0173デフォルトの名無しさん
2005/06/24(金) 12:20:42×>-
○->
でわ?
0174デフォルトの名無しさん
2005/06/24(金) 12:21:530175デフォルトの名無しさん
2005/06/24(金) 12:36:41m9(^Д^)プギャー
0177デフォルトの名無しさん
2005/06/24(金) 12:53:41realloc()はメモリ領域が移動しないことを保証しないのだが。
>>156
長いもんはアップローダ使おうな。
>>158
volatile const char * p;
なんてこともあるね。
>>155
JIS x3010とか。
少しは検索しようや。
ttp://www.jisc.go.jp/
0178デフォルトの名無しさん
2005/06/24(金) 13:17:42{
}
上記の判定があるのですが、buf1に文字列ABCD buf2に文字列ABCがあったと
します。今まではbuf1にbuf2が含まれていても、完全一致でも
どっちでもよかったのですが、今回から完全一致にしないといけなくなりました
どうしたら良いですか?
0179デフォルトの名無しさん
2005/06/24(金) 13:19:24memcmpにはもう一個引数があった筈だが。
0180デフォルトの名無しさん
2005/06/24(金) 13:20:270181デフォルトの名無しさん
2005/06/24(金) 13:21:340182デフォルトの名無しさん
2005/06/24(金) 13:24:47だから何故strcmp()を使わないのかと。
0183デフォルトの名無しさん
2005/06/24(金) 13:27:130184デフォルトの名無しさん
2005/06/24(金) 13:27:490185デフォルトの名無しさん
2005/06/24(金) 13:30:340186デフォルトの名無しさん
2005/06/24(金) 13:31:19できるだけコストがかからないよう、メモリ領域が移動しないように
~~~~~~~~~~~
0187186
2005/06/24(金) 13:37:04スマソ
この実装について前になんかのドキュメントで読んだ気がするんだけど、気のせいだったかな。
0188デフォルトの名無しさん
2005/06/24(金) 13:47:23仕様で「できるだけ〜」とか書いても意味無いから。
もちろん、大抵の実装においてはあまり移動しないようにしてるだろうけど。
0189デフォルトの名無しさん
2005/06/24(金) 13:49:16規格やmanがどうあれ、実際がどうなのか試してみたほうが実際的じゃね?
int main(void)
{
char *p;
printf("%p\n", p = malloc(sizeof(p)));
printf("%p\n", p = realloc(p, sizeof(p) + 10));
printf("%p\n", p = realloc(p, sizeof(p) + 20));
printf("%p\n", p = realloc(p, sizeof(p) + 30));
printf("%p\n", p = realloc(p, sizeof(p) + 40));
return 0;
}
案の定、途中で別のmallocとかはさむとアドレス変わるようだね。
まぁしかし、漏れのWinでは出来るだけ移動しないよう、必死にしがみついてるようにみえる。
0190初心者
2005/06/24(金) 13:59:190191デフォルトの名無しさん
2005/06/24(金) 14:05:030192デフォルトの名無しさん
2005/06/24(金) 14:06:23同じく linux でこれやってみた。
void main()
{
void *p1 = NULL, *p2 = NULL;
int i;
for(i=0; i<100; i++) {
printf("%p %p\n", p1=realloc(p1, i*100), p2=realloc(p2,i*100));
}
free(p1);
free(p2);
}
できるだけ移動しないようがんばってる。
でもこのことに強く縛られるコーディングは、環境依存になっちゃうかな。
やっぱ規格に無いことを仮定するわけにはいかないかな。
とは言え、普段は realloc はできるだけメモリ領域を移動させないようがんばってくれてる、として扱っちゃってるけど。
>>190
本くらいは買った方がいいかも。
コンパイラなどはタダで手に入る。
0193デフォルトの名無しさん
2005/06/24(金) 14:38:18この場合は KOUZOUTAI の配列3つなので、「3」 を返すようなものです。
struct KOUZOUTAI{
char *hoge;
char *hage;
};
struct KOUZOUTAI dataTable[] = {
{"aaa", "aa"},
{"bb", "bbb"},
{"c", "cccc"},
};
0194デフォルトの名無しさん
2005/06/24(金) 14:46:080195デフォルトの名無しさん
2005/06/24(金) 14:48:50sizeof(dataTable)/sizeof(*dataTable)
0196デフォルトの名無しさん
2005/06/24(金) 16:41:27結果をリダイレクトする為にCソースコード内で
テキストに追加モードで結果出力するコードを書きたいです。
ストリーム?とかいう言葉を耳にした事はあります。
できればUNIXでもWindowsでコンパイルしても有効な方法がいいと思ってます
よろしくお願いします。
0197デフォルトの名無しさん
2005/06/24(金) 16:41:39┃┌╋──╋┐┃
└╋┘ └╋┘
┃ ・ ・ ┃ ┌━━┐
●━╋┐ ┌╂━━━━╂┐ ┃
└━┷┴━━╂┘ └╋━┘
同じスレにはコピペ ┌╋┐ ┌╋┐
できるけど、違う ┃└╋╋━━╋╋┘┃
スレにはコピペでき ┃ ┃┃ ┃┃ ┃
ない不思議コピペ ┃ ┃┃ ┃┃ ┃
└━┘┘ └└━┘
0198デフォルトの名無しさん
2005/06/24(金) 16:42:40教えてください!
0199デフォルトの名無しさん
2005/06/24(金) 16:43:10何が聞きたいんだ?
0200デフォルトの名無しさん
2005/06/24(金) 16:44:00テイラー展開
0201デフォルトの名無しさん
2005/06/24(金) 16:46:48テイラー展開ってどうすればいいでしょうか?
まだ、はじめたばかりなんで全然わかんないんです。
0202デフォルトの名無しさん
2005/06/24(金) 17:08:56http://www.nyanya.sakura.ne.jp/es/math/tenkai.html
sin ならマクローリン展開の方を見たほうがいい。
f(x) の f に sin を当てはめて式を解けば、sin を単純な式で表すことができるよ。
0203デフォルトの名無しさん
2005/06/24(金) 17:31:48二次元配列に格納するにはどうすればいいんでしょうか?全然わかりません・・
0204デフォルトの名無しさん
2005/06/24(金) 17:40:43┃┌╋──╋┐┃
└╋┘ └╋┘
┃ ・ ・ ┃ ┌━━┐
●━╋┐ ┌╂━━━━╂┐ ┃
└━┷┴━━╂┘ └╋━┘
同じスレにはコピペ ┌╋┐ ┌╋┐
できるけど、違う ┃└╋╋━━╋╋┘┃
スレにはコピペでき ┃ ┃┃ ┃┃ ┃
ない不思議コピペ ┃ ┃┃ ┃┃ ┃
└━┘┘ └└━┘
0205デフォルトの名無しさん
2005/06/24(金) 17:46:45Cの話とは違う話だけど、
sin を微分すると cos、cos を微分すると -sin になる。
f' ってのは f を一回微分すること、f'' ってのは f を二回微分すること。
さらに sin(0) = 0、cos(0) = 1 を踏まえれば、式を解くことができるでしょ。
出来上がった式をループで表現するなりなんなりでがんばってみ。
0206デフォルトの名無しさん
2005/06/24(金) 17:55:51ttp://pc8.2ch.net/test/read.cgi/tech/1119514274/79
0207デフォルトの名無しさん
2005/06/24(金) 18:00:06普通逆だろ。
0208デフォルトの名無しさん
2005/06/24(金) 18:05:24学校の課題だからじゃねーの?
0209デフォルトの名無しさん
2005/06/24(金) 21:37:240210デフォルトの名無しさん
2005/06/24(金) 21:59:46高専とかかな?
0211デフォルトの名無しさん
2005/06/24(金) 22:22:42なんちゃって。
0212デフォルトの名無しさん
2005/06/24(金) 22:37:300213デフォルトの名無しさん
2005/06/24(金) 22:43:35void put_nchar(char ch,int no){・・・}
を作成し、この関数を利用して平行四辺形を表示するプログラムを作成せよ。
実行結果
平行四辺形を作ります。
横幅:5
高さ:3
* * * * *
* * * * *
* * * * *
上の実行結果の例では、1行に*を5個表示する関数put_nchar()を3回呼び出す。
呼び出す時には実引数chには'*'を指定する。
ずれてるかもしれないけど、この問題教えてください
0214デフォルトの名無しさん
2005/06/24(金) 22:46:27C/C++の宿題を片付けます 46代目
http://pc8.2ch.net/test/read.cgi/tech/1119514274/l50
0215デフォルトの名無しさん
2005/06/25(土) 00:09:56プログラミングを家でやりたいと思っているんですが、どんなコンパイラが
いいか知りたいんですけど、ちなみに、c言語です
0216デフォルトの名無しさん
2005/06/25(土) 00:14:08http://homepage2.nifty.com/tenk/prog/free_cc.htm
0217デフォルトの名無しさん
2005/06/25(土) 00:38:14見れないよ。
0218デフォルトの名無しさん
2005/06/25(土) 00:41:19みれるよ。
0219デフォルトの名無しさん
2005/06/25(土) 00:47:47見られるよ。
0220デフォルトの名無しさん
NGNG>>217
URLをドラッグ&コピーしてブラウザに貼り付けるとイイよ。
([ショートカットのコピー]ではなく[コピー]で。)
0221デフォルトの名無しさん
2005/06/25(土) 00:52:25見られられないよ
0222デフォルトの名無しさん
2005/06/25(土) 01:08:41のC/C++のお勉強〜WisdomSoftのススメ〜
0223デフォルトの名無しさん
2005/06/25(土) 01:20:18余談だが、VCではconstを付けると落ちる。
0224デフォルトの名無しさん
2005/06/25(土) 01:24:52え?
int main(int argc, char const * const argv)
とかいて、
**argvのなかをかきかえるとおちるということ?
なんで?
0225デフォルトの名無しさん
2005/06/25(土) 01:29:320226デフォルトの名無しさん
2005/06/25(土) 01:30:03なんで落ちるんだろう?
手元の VC++ 6.0 で
#include <stdio.h>
int main(int argc, const char * const *argv)
{
printf("hello world! %d, %p\n", argc, argv);
getchar();
return 0;
}
を実行してみたけど、普通に動いたよ。
トレースして落ちる原因を探ってみたいね。
0227デフォルトの名無しさん
2005/06/25(土) 01:39:45それを呼ぶ側のコード(argvを確保してるコード)は変わらない
んだから、ふつうに考えりゃおちるわきゃない
0228デフォルトの名無しさん
2005/06/25(土) 01:48:13もしかしたらさ、もし C++ のコンパイラだったりすると、プロトタイプの違いで意図しない関数エントリにリンクしちゃったりして?
0229デフォルトの名無しさん
2005/06/25(土) 01:55:050230デフォルトの名無しさん
2005/06/25(土) 01:55:42ああ、なるほど、type safe linkingならそうなりそうだが
C++であってもmain()の宣言が適当でも動くよな
なんでだろう
0231デフォルトの名無しさん
2005/06/25(土) 02:42:41関数を作りたいのですが、どうすればいいですか。
0232デフォルトの名無しさん
2005/06/25(土) 02:57:010233デフォルトの名無しさん
2005/06/25(土) 02:58:490234デフォルトの名無しさん
2005/06/25(土) 03:03:12前に入力した行までback spaceで戻って修正する機能が
欲しいのです。
0235デフォルトの名無しさん
2005/06/25(土) 03:08:42それは入力されるプログラム側ではなく、入力する端末エミュレータ側の問題。
0236デフォルトの名無しさん
2005/06/25(土) 03:10:45#include <stdio.h>
void *fgets_n(void *buf, size_t bufsize, int getlines, FILE *fp)
{
int i = 0;
char *p = buf;
if( p == NULL || bufsize <= 0)
{
return NULL;
}
if( bufsize > 2 && getlines > 0 && fp != NULL )
{
int ch, line_cnt = 0;
while( i < bufsize-1 && EOF != (ch = fgetc(fp)))
{
p[i++] = ch;
if( p[i-1] == '\n')
{
if( ++line_cnt == getlines )
break;
}
}
}
p[i] = '\0';
return buf;
}
0237デフォルトの名無しさん
2005/06/25(土) 03:18:50どうもです。
これってどのようにして使うのですか。
0238デフォルトの名無しさん
2005/06/25(土) 03:22:03一度に取得したい行数を引数getlineで指定。
あんまり、使い道はないかと思うけどw
fgets にあわせるなら、こうだな。
#include <stdio.h>
void *fgets_n(void *buf, size_t bufsize, int getlines, FILE *fp)
{
int i = 0;
char *p = buf;
if( p == NULL || bufsize <= 0 || fp == NULL || feof(fp))
{
return NULL;
}
if( bufsize > 2 && getlines > 0)
{
int ch, line_cnt = 0;
while( i < bufsize-1 && EOF != (ch = fgetc(fp)))
{
p[i++] = ch;
if( p[i-1] == '\n')
{
if( ++line_cnt == getlines )
break;
}
}
}
p[i] = '\0';
return buf;
}
0239デフォルトの名無しさん
2005/06/25(土) 03:25:38どうもです。
やっぱりbackspaceで戻れないのは仕方ないみたいですね。
複数行の入力の参考にしてみますです。
0240デフォルトの名無しさん
2005/06/25(土) 04:12:510241デフォルトの名無しさん
2005/06/25(土) 05:32:42>>133
ANSI標準ではないが、mktemp()という関数があるから
ソース探して参考にしなはれ
0242デフォルトの名無しさん
2005/06/25(土) 06:26:37>236=238は>234も読めないらしいし、>234=>237は>235も読めないらしい。
そもそも1行内は編集可能なのはfgets()とは無関係だと判っていないのだろうか。
0243デフォルトの名無しさん
2005/06/25(土) 08:21:13話に入ってくるなよw
0244デフォルトの名無しさん
2005/06/25(土) 09:31:50低レベルだから入れるんじゃないか。
高レベルなら入る必要ないしね。
0245デフォルトの名無しさん
2005/06/25(土) 10:19:570246デフォルトの名無しさん
2005/06/25(土) 10:36:01難しいのは誰もが納得する代案を提示することだ。
0247デフォルトの名無しさん
2005/06/25(土) 12:51:110248デフォルトの名無しさん
2005/06/25(土) 13:01:26if ( 人間 <下天のもの ) return like(夢, 幻);
return NULL;
0249デフォルトの名無しさん
2005/06/25(土) 15:05:09正直、織田信長を最初に知った時、
このネーミングセンスに驚いたよ。(w
0250デフォルトの名無しさん
2005/06/25(土) 15:23:06そもそもargvは書き換え可能でなければならないわけだが。
0251デフォルトの名無しさん
2005/06/25(土) 16:22:12それは main を呼び出す側に課せられた条件でしょ?
main の中以降で argv を書き換えないならば、const 指定しても問題ないはずじゃないの?
0252デフォルトの名無しさん
2005/06/25(土) 16:51:38typing時間の無駄
0253デフォルトの名無しさん
2005/06/25(土) 16:53:22タイプ数を減らすことはオプティマイザが最適化するヒントを減らす以上に価値のあることなのか?
0254デフォルトの名無しさん
2005/06/25(土) 17:21:060255デフォルトの名無しさん
2005/06/25(土) 17:37:54それすら実行されずにsegmentation faultになります
どなたかおたすけおぉぉ
void klt_data()
{
D('z');
FILE *fp;
char buffer[MAX_BUFFERSIZE];
char file_name[MAX_FILENAME];
double eigen_vector[MAX_IMAGESIZE][MAX_IMAGESIZE];
double eigenT_vector[MAX_IMAGESIZE][MAX_IMAGESIZE];
int dim_num,n;
int x,y,i,j;
D('z');
/* 固有ベクトルファイルのオープン */
printf("固有値ベクトルファイルの名前:");
scanf("%s",file_name);
fp = fopen(file_name,"rb");
if(NULL == fp){
printf("その名前のファイルは存在しません。\n");
exit(1);
}
以下続
0256デフォルトの名無しさん
2005/06/25(土) 17:38:470257デフォルトの名無しさん
2005/06/25(土) 17:41:51printf()の最初の引き数はなんでしょう。
0258デフォルトの名無しさん
2005/06/25(土) 17:47:11えっと intです!
0259デフォルトの名無しさん
2005/06/25(土) 17:47:460260デフォルトの名無しさん
2005/06/25(土) 17:48:22エントリポイントがどうした
0261デフォルトの名無しさん
2005/06/25(土) 17:48:28と定義してます.
途中でintとかもだせるように intにしいときました
0262デフォルトの名無しさん
2005/06/25(土) 17:53:35>#define D(a) fprintf(stdout,"-------------------debug %d--------------------\n",a)
>と定義してます.
>途中でintとかもだせるように intにしいときました
書いていることが矛盾だらけ。
0263デフォルトの名無しさん
2005/06/25(土) 17:55:18あー、わかった。
標準出力はバッファリングされている可能性あり。
0264デフォルトの名無しさん
2005/06/25(土) 17:56:12ごめんなさい まだCのことがよくわかってなくて・・・
printfじゃありませんでした fprintfです.
それとintもだせるように%dにしましたの間違いです
どうして一番初めすら実行されずにsegmentation faultになるのか
どうしてもわかりません
よろしくお願いします
0265デフォルトの名無しさん
2005/06/25(土) 17:57:10その関数はなくて、他の部分に問題があるんじゃないのかな?
あと、MAX_IMAGESIZE と MAX_IMAGESIZE の定義はいくつくらいになってるの?
あんまりデカいと stack overflow するかも。
つーか、stack overflow のせいで segmentation fault が出てるのかも?
0266デフォルトの名無しさん
2005/06/25(土) 18:00:180267デフォルトの名無しさん
2005/06/25(土) 18:01:32すいません 知識不足で申し訳ないのですが どういう意味でしょうか?
>>265
その二つはともに1024です.
ひとつ思いあたるのは,この関数を呼び出す前にサイズが40000
の配列を用いているのでそれが原因でしょうか?
でも,この関数単体で実行させてもsegmentation faulltになります・・・
0268デフォルトの名無しさん
2005/06/25(土) 18:02:430269デフォルトの名無しさん
2005/06/25(土) 18:04:161024 * 1024 * sizeof(double) = 8MB
そういう配列が 2個もあるから、スタックに 16MB 以上のデータがあることになるよね。
スタックって有限だから、そのデータがスタックに収まりきらないんだよ。
malloc で確保した方がいいよ。
0270デフォルトの名無しさん
2005/06/25(土) 18:10:43やっと理解しました ありがとうございます!
mallocはなんか難しいそうで敬遠していましたが
チャレンジしてみようと思います
最後のフロンティア・・・
恐ろしい
0271デフォルトの名無しさん
2005/06/25(土) 18:22:19使うデータを構造体にして、それを一括で malloc すると便利じゃないかな。
typedef struct {
double eigen_vector[MAX_IMAGESIZE][MAX_IMAGESIZE];
double eigenT_vector[MAX_IMAGESIZE][MAX_IMAGESIZE];
} MYDATA;
みたいにして、
void klt_data()
{
FILE *fp;
char buffer[MAX_BUFFERSIZE];
char file_name[MAX_FILENAME];
MYDATA *data;
data = malloc(sizeof(*data));
}
こんなかんじ。
MYDATA のメンバに、関連する変数も一緒に入れておくといいと思う。
あと、malloc したメモリがいらなくなったら free を忘れずに。
0272デフォルトの名無しさん
2005/06/25(土) 18:25:53>>263
標準出力はバッファリングされるので、printf()で毎回出力されるとは限らない。
エラーチェックの目的で使うなら、バッファフラッシュを行なうかバッファリングされないエラー出力を使うべき。
0273デフォルトの名無しさん
2005/06/25(土) 18:27:45たいていは標準出力は改行でフラッシュされるようになってるはず
(標準エラー出力はとっととフラッシュされる)
0274デフォルトの名無しさん
2005/06/25(土) 18:49:51どうも親切にありがとうございます.
そのとおりにやってみたところなぜかエラーが!
自分で考えてみようと思います
>>272 273
念のためstderrに出力するようにします!
0275デフォルトの名無しさん
2005/06/25(土) 18:52:01必要なヘッダファイルが include されてないとか?
まあがんばれ。
0276デフォルトの名無しさん
2005/06/25(土) 18:55:03typedef int ARRAY[4][4];
ARRAY *p;
これはうまくいきます。
これを typedef を使わないで書きたいと思い、
int[4][4] *p;
としたら、コンパイルでエラーとなりました。
どのように書くべきでしょうか?
0277デフォルトの名無しさん
2005/06/25(土) 19:00:42hoge()
#endif
みたいなことってできますか?
wchar_t==2とint==4をやりたいのですが。。
0278デフォルトの名無しさん
2005/06/25(土) 19:01:170279デフォルトの名無しさん
2005/06/25(土) 19:02:33int (*p)[4];
0280デフォルトの名無しさん
2005/06/25(土) 19:04:49automake/autoconf でも使えば?
0281デフォルトの名無しさん
2005/06/25(土) 19:05:23ありがと!
int (*p)[4][4]; でイケました!
0282デフォルトの名無しさん
2005/06/25(土) 19:07:20それ3次元配列へのポインタだぞ
2次元配列なら>>279であってる
0283274
2005/06/25(土) 19:12:35>>271
何度も申し訳ないのですがやはりできません
いろいろと調べてためしに以下のようにして
コンパイルしたのですが
confllicting type for data等のエラーメッセージが出てしまいます...
typedef struct mydata{
unsigned int matrix[MAX_DATA_NUM][3];
unsigned char image1[MAX_IMAGESIZE][MAX_IMAGESIZE];
unsigned char image2[MAX_IMAGESIZE][MAX_IMAGESIZE];
}MYDATA;
MYDATA *data;
data = (MYDATA * )malloc(sizeof(MYDATA));
0284277
2005/06/25(土) 19:13:260285デフォルトの名無しさん
2005/06/25(土) 19:19:384x4 の int の配列を指し示すポインタが欲しいのですが、>>279 で合ってますか?
>>279 だと添え字が一次元分しか指定できませんが、もう一つの添え字のサイズはいくつになるのでしょう?
また、>>281 において
printf("%p\n", &(*p)[y][x]);
にて各要素のポインタを確認しましたが、正しい位置を示しています。
しかし >>279 の方法では
printf("%p\n", &p[y][x]);
で同様のポインタを示しますね。
どう理解したらいいでしょうか?
0286デフォルトの名無しさん
2005/06/25(土) 19:24:26君は一次元配列を指すときにどうやっとるのか
int a[N];
int *p = a;
だろ。ここには要素数の情報は無い。
二次元以上になって、要素数が必要になるんだが、Cの多次元配列ってのは
要するに配列の配列だったりするから、最後の配列の分だけは要素数が
要らない。それ以外の要素数がいるのは、その配列に格納する要素のサイズ
を知るのに必要だから。
0287デフォルトの名無しさん
2005/06/25(土) 19:25:15confllicting type for data ってことは、data の定義がコンフリクトしてる、ってことだよね。
グローバル変数とかで data ってキーワードをなにかに使ってない?
とりあえず、その関数内の data っていう名前を別のに変えてみたら?
0288デフォルトの名無しさん
2005/06/25(土) 19:26:48int a[M][N];
int (*p)[N] = a;
とすれば、
for (i = 0; i < M; ++i)
for(j = 0; j < N; ++j) {
p[i][j] = ...:
}
}
のように、要するに普通に二次元配列を使うのと同じやりかたで使えるよ。
0289デフォルトの名無しさん
2005/06/25(土) 19:31:38あー、わかりました。
int (*p)[4] の 4 は、二次元目の 4 なんですね。
一次元目の 4 は特に指定する必要が無いと。
でも、sizeof(*p) は意図した値にはならないですね・・・
0290デフォルトの名無しさん
2005/06/25(土) 19:34:00一次元配列を指すただのintのポインタから、配列のサイズは取れんだろ
それと同じ
0291
2005/06/25(土) 19:36:19#include <string.h>
struct profile{
char sex[5];
char name[10];
char adress[100];
char telnum[20];
int old, height, weight;
};
int main(void){
struct profile member[5];
int i;
for(i=0; i<4; i++){
printf("プロフィールを入力してください\n");
printf("性別\n"); scanf("%s", member[i].sex);
printf("名前\n"); scanf("%s", member[i].name);
printf("住所\n"); scanf("%s", member[i].adress);
printf("電話番号\n"); scanf("%s", member[i].telnum);
printf("年齢\n"); scanf("%d", member[i].old);
printf("身長\n"); scanf("%d", member[i].height);
printf("体重\n"); scanf("%d", member[i].weight);
}
0292
2005/06/25(土) 19:36:42printf("プロフィールを表示します\n");
printf("性別:%s", member[i].sex);
printf("名前:%s", member[i].name);
printf("住所:%s", member[i].adress);
printf("電話番号:%s", member[i].telnum);
printf("年齢:%d", member[i].old);
printf("身長:%d", member[i].height);
printf("体重:%d", member[i].weight);
}
return;
}
0293
2005/06/25(土) 19:37:38なぜでしょうか?
0294デフォルトの名無しさん
2005/06/25(土) 19:39:14たしかにそれはもっともなのですが、malloc するのに sizeof 一発でサイズが取れた方が便利ですよね。
というときには、
int (*p)[N][M] = malloc(sizeof(*p));
使うときには
*p[i][j] = xxx;
みたいに使うことになりますよね。
int (*p)[M] = malloc(sizeof(p) * N);
だとサイズの取得部分が煩雑な気もしますし、一方で
p[i][j] = xxx;
で使えるのはスマートだし、
うーむ・・・
0295デフォルトの名無しさん
2005/06/25(土) 19:39:15身長と体重も同様にな
0296
2005/06/25(土) 19:43:16サンクスです。初歩的なミスですいません。初心者なんで
0297デフォルトの名無しさん
2005/06/25(土) 19:44:17そもそも三次元配列を指すポインタで二次元配列を操作するのは型的に
正しくない。
int a[M][N];
int (*p)[M][N];
で、p = a;
とはできんし、p[i][j]と書けないのは、そういうこと。
malloc()うんぬんは、コードで言うとただの一行だけの問題だから、
瑣末な話と考えるが。
0298デフォルトの名無しさん
2005/06/25(土) 20:00:03その辺の理解はできてきたつもり。
ただ、これは配列だからそういう数通りの書き方があって、その解釈をどうするのか、という問題になるけど、
たとえば structure の場合、
MYSTRUCT a;
MYSTRUCT *p;
で
p = a;
とはできないし、p.member とも表現できないのと同じなのではないでしょうか?
二重配列のメモリ領域を指し示すポインタと、二重配列そのものとして振舞うポインタとはちょっと意味が違って、
この辺はプログラマが意図に応じて定義を意味的に正しく使い分けるべきではないかと思いました。
それを踏まえて、自分のケースにおいてどちらが適切かよく考えてみます。
ありがとうございました。
# malloc の一行だけではなく、memcpy したり通信したりでサイズを取得する機会は多いです
0300デフォルトの名無しさん
2005/06/25(土) 20:17:41とりあえず関数の変数宣言のところを一通り抜き出してみたらどうかな。
MYDATA *data って、関数のローカル変数なんだよね?
0301274
2005/06/25(土) 20:42:51今はグローバル変数として宣言してます
宣言部は以下のような感じです
#include<stdio.h>
#include<stdlib.h>
#define D(a) fprintf(stdout,"-------------------debug %d--------------------\n",a)
#define MAX_DATA_NUM 40000
#define MAX_IMAGESIZE 1024 /* 縦・横の最大画素数 */
#define MAX_BRIGHTNESS 255 /* 最大階調値 */
#define MAX_FILENAME 256 /* ファイル名の最大長 */
#define MAX_BUFFERSIZE 256 /* バッファ最大長 */
static int matrix_size;
typedef struct mydata{
unsigned int matrix[MAX_DATA_NUM][3];
unsigned char image1[MAX_IMAGESIZE][MAX_IMAGESIZE];
unsigned char image2[MAX_IMAGESIZE][MAX_IMAGESIZE];
}MYDATA;
MYDATA *data;
data = (MYDATA * )malloc(sizeof(MYDATA));
int x_size1, y_size1,x_size2, y_size2;
0302デフォルトの名無しさん
2005/06/25(土) 20:46:12関数の外側の宣言部で
data = malloc(...)
はマズいだろ
君はmain()を書かずに全部のプログラムを書く気か
0303デフォルトの名無しさん
2005/06/25(土) 20:47:23そんなところに malloc 置いちゃだめだよ。
MYDATA をローカル変数にして、関数の中で malloc しな。
typedef はその位置でもいいけど、最初のグローバル変数宣言の前、#define 群の次くらいがいいんじゃないかな?
0304デフォルトの名無しさん
2005/06/25(土) 21:04:41>main()を書かずに
その手があった!
今、お前のおかげで全然関係ない問題を解くことが出来そうだ
0305デフォルトの名無しさん
2005/06/25(土) 21:07:14C++?制御系?それともWinMain()?(ワラ
0307デフォルトの名無しさん
2005/06/25(土) 21:17:25ライブラリじゃねぇべか?
0308デフォルトの名無しさん
2005/06/25(土) 21:17:42制御
0309デフォルトの名無しさん
2005/06/25(土) 21:38:41またまた壁にぶつかってしまいました
1 1 1
1 1 1
1 1 1
のように数字が三つならんでいるファイルから数字を読み,
それを配列にいれたいのですが,なぜか入っている数字を
出力すると2289044等のなぞの数字がでてきます
どなたか落ちからぞえを.
char buffer[MAX_BUFFERSIZE];
unsigned int matrix[MAX_DATA_NUM][3];
for(;i < matrix_size;i++) {
if(buffer[0] != '#'){
fgets(buffer, MAX_BUFFERSIZE, fp);
sscanf(buffer, "%d %d %d", &x, &y, &gray_scale);
fprintf(stdout, "%d %d %d\n", &x, &y, &gray_scale);
matrix[i][0] = x;
matrix[i][1] = y;
matrix[i][2] = gray_scale;
}
}
0310デフォルトの名無しさん
2005/06/25(土) 21:41:24printf では、数値の出力時に渡すのはポインタじゃないよ。
変数につけた & を取ればよろしい。
0311デフォルトの名無しさん
2005/06/25(土) 21:50:02うぐぅ ありがとうございます
馬鹿な間違いをしてすいません 先生
0312デフォルトの名無しさん
2005/06/25(土) 23:20:560313デフォルトの名無しさん
2005/06/25(土) 23:22:08aをbだけビットシフトするだなんてふざけるな!
いつからビットシフトすることになったんだよ!
0314デフォルトの名無しさん
2005/06/25(土) 23:27:25「>>」はどっちにシフトするんですか?
0315デフォルトの名無しさん
2005/06/25(土) 23:29:53直感的にこっちと感じる方向があるだろ。
0316デフォルトの名無しさん
2005/06/25(土) 23:30:09右
数が小さくなる方
0317デフォルトの名無しさん
2005/06/25(土) 23:34:350318デフォルトの名無しさん
2005/06/25(土) 23:34:49ありがとうございました
0319デフォルトの名無しさん
2005/06/25(土) 23:35:360320デフォルトの名無しさん
2005/06/25(土) 23:36:24>直感的にこっちと感じる方向があるだろ。
ところで、明日はどっちですか?
0321デフォルトの名無しさん
2005/06/25(土) 23:36:50ああ、それは良く思う。
0322デフォルトの名無しさん
2005/06/25(土) 23:41:10中順、後順でなぞって出力する関数はどういう風に書いたらいいですか?
っていうか、プログラムのこの部分だけじゃ書けないですかね…
void walkNode(stNode* lpSt){
/*2分木を前順でなぞっていくwalkNode関数の内容*/
printf("%c, ",lpSt->nodename); /*2分木の要素を出力*/
if(lpSt->left) walkNode(lpSt->left); /*子左側を再帰的に呼び出す*/
if(lpSt->right) walkNode(lpSt->right); /*子右側を再帰的に呼び出す*/
}
0323デフォルトの名無しさん
2005/06/25(土) 23:43:10してみ?
0324デフォルトの名無しさん
2005/06/25(土) 23:58:44ありがとうございます!
へぇ…2つとも簡単にかけるんですね…。もう一回勉強しなおさなければ…
0325デフォルトの名無しさん
2005/06/26(日) 00:01:02前順ってどんな順?
ついでに、中順、後順ってどんな順?
左の先端からが前順だとすれば、>>322 のコードはおかしくない?
0326デフォルトの名無しさん
2005/06/26(日) 00:17:37>>255
> void klt_data()
> {
> D('z');
> FILE *fp;
>
> あ Dはprintfですー
printf()の呼び出しの後に変数宣言は出来ないだろう。
0327C99
2005/06/26(日) 00:18:340328デフォルトの名無しさん
2005/06/26(日) 00:29:41(´・ω・`)
0329デフォルトの名無しさん
2005/06/26(日) 01:30:490330デフォルトの名無しさん
2005/06/26(日) 01:33:000331デフォルトの名無しさん
2005/06/26(日) 01:33:25コンパイルが通りませんって質問ならまだしも。
0332デフォルトの名無しさん
2005/06/26(日) 01:41:470333デフォルトの名無しさん
2005/06/26(日) 01:45:110334デフォルトの名無しさん
2005/06/26(日) 11:15:45ポインタをいったんNULLってしたら
そのポインタにアドレス覚えさせることはもうできない?
そんなんだとシュクダイ終わらないんだがどうしよっか?
0335デフォルトの名無しさん
2005/06/26(日) 11:18:41ジェダイだかシュクダイも終わりそうにないですね。
0336デフォルトの名無しさん
2005/06/26(日) 11:19:290337354
2005/06/26(日) 11:20:28けっこー困ってる
ボーランドのフリーのやつ使ってんだが
動いてくれないんだよな
0338sage 334
2005/06/26(日) 11:22:13即スレサンクス
それ使って考え直しますわ
0339デフォルトの名無しさん
2005/06/26(日) 11:27:16死んどけ。つーか、真面目に質問したいなら宿題スレか初心者スレにでも逝け。
0340デフォルトの名無しさん
2005/06/26(日) 13:45:25自分が考えたのは、長男次弟方式による実現によって任意の木を2分木にできるっていうものなんですけど…
他に何かあったら教えてください
0341デフォルトの名無しさん
2005/06/26(日) 14:09:15趣味:アニメ鑑賞、枝刈
血液:log型
0342デフォルトの名無しさん
2005/06/26(日) 14:11:020343デフォルトの名無しさん
2005/06/26(日) 14:12:220344デフォルトの名無しさん
2005/06/26(日) 14:12:46のこと
0345デフォルトの名無しさん
2005/06/26(日) 14:13:04構造体へのポインタから構造体のメンバを参照するときに使う。
(*A).Bと同じだとか書いていなかったか?
0346デフォルトの名無しさん
2005/06/26(日) 15:20:43以下の関数についてわからない点があるので、誰か教えてください。
/*
static int
Xcast6GetSrc(struct xcast_group *g, struct sockaddr_in6 *dst)
{
int fd;
int ret;
int i, found;
struct sockaddr_storage src, dstn;
struct sockaddr_in6 dstd, *sin6;
socklen_t len;
SOCKET_ADDRESS_LIST *psal;
DWORD alen;
fd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
if (fd < 0)
return fd;
dstd = *dst;
dstd.sin6_port = htons(DISCARD_PORT);
ret = Xcast6NormalizeAddr(&dstd, &dstn, &len);
*/
変数"len"と"dstn"が初期化されてないまま使用されているのですが,これはどういう意味なんでしょうか?
オリジナルのソースはい次の場所にあります。
http://sourceforge.net/project/showfiles.php?group_id=30760&package_id=22808
僕自身のレベルは、UNIXのechoコマンドが読める程度と考えてください。
ご教授お願いします。
0347デフォルトの名無しさん
2005/06/26(日) 15:23:12Xcast6NormalizeAddrの中で値を参照することなしに代入しているのではないだろうか。
0348デフォルトの名無しさん
2005/06/26(日) 15:24:330349デフォルトの名無しさん
2005/06/26(日) 15:33:40347,348さん、ありがとうございます。
すいません。Xcast6NormalizeAddrのなかをざっと検索したところ
関数内で初期化してました。
変数を宣言するだけだと、メモリに領域を取るだけで、その領域にはゴミがあるという
話を以前に聞いたことがあったので、なぜゴミを参照するのか疑問に思ったので質問させてもらいました。
こんな書き方あるんですね。
というか、あんがい普通だったりするんでしょうか?
今度からは、もうちょっと慎重に原因追求してから質問させていただきます。
本当に申し訳ありませんでした。
0350デフォルトの名無しさん
2005/06/26(日) 15:54:40> というか、あんがい普通だったりするんでしょうか?
ごくごくふつう。
関数Aに変数Bのアドレスを渡したからといって
Aの中でBの値を参照しているとは限らないわけで、Bを更新しているだけなら
Bの値が初期化されていなくても問題ないわけだ。
そういうのをout引数と言ったりする。
0351349
2005/06/26(日) 16:04:25out引数と言うんですか。
自分でも恥ずかしい質問をした(よく調べればわかるという点で)と思っているのですが
またひとつ勉強になったので、得るものが大きかったです。
ありがとうございます。
0352デフォルトの名無しさん
2005/06/26(日) 17:09:520353349
2005/06/26(日) 17:22:310354デフォルトの名無しさん
2005/06/26(日) 17:34:43つhttp://www.kouno.jp/home/c_faq/c20.html#1
0355349
2005/06/26(日) 17:46:15ありがとうございます。
これだけのことをしていただいたのですから
最後まであきらめずにコードを読みきりたいと思います。
本当に感謝しています。
0356デフォルトの名無しさん
2005/06/26(日) 18:07:54ttp://tool-ya.ddo.jp/2ch/trash-box/file/20050626180602201.txt
0357デフォルトの名無しさん
2005/06/26(日) 18:14:10とりあえずif文の無駄な{}を減らす。
0358デフォルトの名無しさん
2005/06/26(日) 18:15:260359デフォルトの名無しさん
2005/06/26(日) 18:23:07ではどのようにすればいいのでしょうか?
0360デフォルトの名無しさん
2005/06/26(日) 18:37:50>if(n>=2)
ここが else if になっていないところが分かっててやってんじゃないのか?という疑念を誘われるところだが、
for 文をこの前に持ってこい。
あと、abs だが (X)*-1 にするより (-(X)) にする方がいいんじゃないの?
0361デフォルトの名無しさん
2005/06/26(日) 18:41:02こんなんでどう?
double pow2(int x, int n) {
unsigned int bit = 1 << sizeof(int) * CHAR_BIT - 1;
double a, result = 1.;
if (n > 0) a = x;
else {
a = 1. / x;
n = -n;
}
do {
result *= result;
if (bit & n) result *= a;
} while (bit >>= 1);
return result;
}
0362デフォルトの名無しさん
2005/06/26(日) 18:44:44double pow2(int x, int n)
{
if(n<0) reutrn 1 / pow2(x, ?????);
if(n==0) ?????;
// if(n==1) ?????; // なくてもいい
?????
}
0363デフォルトの名無しさん
2005/06/26(日) 18:45:38int i;
for(i=1;i<abs(n);i++)
z*=x;
return (n>=0)?(double)z:(double)1/z;
0364デフォルトの名無しさん
2005/06/26(日) 18:47:010365356
2005/06/26(日) 19:03:04あとでforを挟もうと思って忘れてました;
absに関してはそうします。
>>361
unsignedとかsizeofとか知らないので調べつつ読んでます。
>>362
n==0,1はmain内で処理するということですか?
だとすると、関数ごとの役割が曖昧になるので嫌です。
>>363
>for(i=1;i<abs(n);i++)
こうすると私の環境では無理でした。
最後の行は参考にさせていただきます。
>>364
確かに"1/z"以外はいりませんね。
ありがとうございます。
0366デフォルトの名無しさん
2005/06/26(日) 19:24:14a×b
(例)4×7=21
#include <stdio.h>
int main(void)
{
char a,b,i,ans;
a=4;
b=7;
ans=0;
for(i=0;i<b;i++){
c += a;
}
printf("a×b = %d",ans);
}
↑これを、ビット列を使ったコードに書き換えたいのだが… どうすればいいでしょうか?><;
0367361
2005/06/26(日) 19:24:26>>362のアドバイスを基に改良
double pow2(int x, int n) {
unsigned int bit = 1U << sizeof(unsigned int) * CHAR_BIT - 1;
double result = 1.;
if (n < 0) return 1./pow2(x, -n);
do {
result *= result;
if (bit & n) result *= x;
} while (bit >>= 1);
return result;
}
0368デフォルトの名無しさん
2005/06/26(日) 19:25:09> ビット列を使ったコード
これは具体的にはどういうこと?
0369デフォルトの名無しさん
2005/06/26(日) 19:25:19汚い
0370↑訂正します
2005/06/26(日) 19:26:47{
char a,b,i,ans;
a=4;
b=7;
ans=0;
for(i=0;i<b;i++){
ans += a;
}
printf("a×b = %d",ans);
}
0371デフォルトの名無しさん
2005/06/26(日) 19:29:18A.txtというファイルから2桁の整数を3回読み込んで、
fgetcを使って総和を求めたいのですが、10の位と1の位の区別ができません。
宜しければ、区別の仕方を教えてください。
0372356
2005/06/26(日) 19:34:02>>361さんのコードを参考に又変えるかもしれませんが、ありがとうございました。
double pow2(int x,int n)
{
int n2,i,z=x;
n2=abs(n);
if(n==0)
return 1;
else if(n==1)
return x;
for(i=1;i<n2;i++)
z*=x;
return (n>=2)?z:(double)1/z;
}
0373デフォルトの名無しさん
2005/06/26(日) 19:35:04求めたいとは何事!
0374うんこプログラマ
2005/06/26(日) 19:35:59>>370は、掛け算を「*」を使わずに、「a を b 回 加算」して答えを求めています。
ですが、私は、これを、シフト演算を用いたコードに書き換えたいのです。
例えば、2×4は、00000010を左に2ビットシフトして、00001000と出来ますよね?
これを、例えば、4×7や5×3など、の計算もできるようにしたい。><;
0375デフォルトの名無しさん
2005/06/26(日) 19:36:43そのコードはabs(n)回の掛け算を行うが、>>361==>>367のコードは
掛け算の回数がもっと少ない。
0376デフォルトの名無しさん
2005/06/26(日) 19:39:58ひんと1:二進数に変換するアルゴリズム
ひんと2:4*7=(4>>2)+(4>>1)+4
0377デフォルトの名無しさん
2005/06/26(日) 19:40:44fgetcで読み込んで、読み込んだ2桁の数字を
足していき、総和を求めたいという事です。
0378デフォルトの名無しさん
2005/06/26(日) 19:46:40懲りずに失礼
#include <stdio.h>
#include <limits.h>
int mul(int a, int b) {
unsigned int answer = 0, bit = 1U << sizeof(unsigned int) * CHAR_BIT - 1, ua = a > 0 ? a : -a, ub = b > 0 ? b : -b;
do {
answer <<= 1;
if (ub & bit) answer += ua;
} while (bit >>= 1);
if (a > 0 && b < 0 || a < 0 && b > 0) answer = -answer;
return answer;
}
int main(void) {
printf("%d", mul(3, 7));
}
0379デフォルトの名無しさん
2005/06/26(日) 19:59:10{
int n2,i,z=1;
n2=abs(n);
for(i=0;i<n2;i++)
z*=x;
return (n>=0)?z:(double)1/z;
}
0380デフォルトの名無しさん
2005/06/26(日) 20:13:51なぜしたいの?
0382デフォルトの名無しさん
2005/06/26(日) 20:28:24fgetcでは区別しなければ、計算できないと思ったからです。
他に方法があるのであれば教えて頂けませんか?お願いします。
0383デフォルトの名無しさん
2005/06/26(日) 20:30:10scanf使えw
0384デフォルトの名無しさん
2005/06/26(日) 20:35:25scanfは使わないでという事なんですが。
問題としてはtxtから2桁の数字を読み込んで、
それを宣言しておいた値に入れていき、全て読み込んだら
終了して、総和を出すという物なんですが。
本当にすいません。
0385デフォルトの名無しさん
2005/06/26(日) 20:36:410386デフォルトの名無しさん
2005/06/26(日) 20:43:52ヒント:35=3×10+5
0387デフォルトの名無しさん
2005/06/26(日) 20:44:08/* 負の数は非対応 */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char **argv)
{
int ch, sum, n;
FILE *fp;
if( argc < 2 || NULL==( fp = fopen(argv[1],"r")))
{
perror("fopen");
return EXIT_FAILURE;
}
sum = n = 0;
while( EOF != ( ch = fgetc(fp)))
{
if( isdigit( ch ) )
{
n = n * 10 + ch - '0';
}
else if( n != 0 )
{
sum += n;
n = 0;
}
}
printf("総計 : %d\n", sum);
fclose(fp);
return EXIT_SUCCESS;
}
0388デフォルトの名無しさん
2005/06/26(日) 20:45:210389デフォルトの名無しさん
2005/06/26(日) 20:46:02こんな感じの問題があったのですが、PCを換えてたら
サイトがもうなくて答えが分からないまま今の状態に
なったというわけなんです。
0390デフォルトの名無しさん
2005/06/26(日) 20:49:25それでためしてみます。本当にありがとうございます。
0392デフォルトの名無しさん
2005/06/26(日) 21:21:410393デフォルトの名無しさん
2005/06/26(日) 21:31:04それともまったく別物?
0394デフォルトの名無しさん
2005/06/26(日) 21:33:18別物でもないけど自動的にってほどでもない。
C++からCの関数を利用する方法を知ってればさしあたり十分。
0395デフォルトの名無しさん
2005/06/26(日) 21:35:12まずはCの構文や、標準関数を一通り使えるようになってから、
C++ へ進むことをお勧めしておく
0396デフォルトの名無しさん
2005/06/26(日) 21:35:510397デフォルトの名無しさん
2005/06/26(日) 21:36:38C89なら、100%じゃないけどC++のサブセット。
だから、C++を勉強すればCの仕様の大半は理解したことになるんだが
C++だけをやっていたのでは、そのサブセットの範囲、限界、差異といったものは
意識することが無いだろう。だから、Cもやってみないと、身にはつかないと
思う。ま、C++を理解したんなら、すぐだけどね。
0398デフォルトの名無しさん
2005/06/26(日) 21:36:56まったく別物だと思った方がC++を勉強しやすいと思う。
0399デフォルトの名無しさん
2005/06/26(日) 21:45:19ありがとう
0400デフォルトの名無しさん
2005/06/26(日) 21:50:29Cさえ押さえれば、他の言語にも入りやすいからって理由で
全員必修として「C」+オプションで他の言語って形だったけど
今でもそうなのかね?
当時はJavaもなかったし、それが妥当だったのかも知れないけど
0401デフォルトの名無しさん
2005/06/26(日) 21:51:110402デフォルトの名無しさん
2005/06/26(日) 21:53:30CFAQでは不満なのか
0403デフォルトの名無しさん
2005/06/26(日) 21:57:030404デフォルトの名無しさん
2005/06/26(日) 21:58:46100 PRG030 START
110 LD GR1,A
120 ADDA GR1,A
130 ADDA GR1,A
140 ST GR1,WK
150 ADDA GR1,WK
160 ST GR1,WK
170 RET
180 A DC 4
190 B DC 8
200 WK DC 1
210 END
実行後のGR1を16進数で記述せよ。
140,150行目を1命令で記述せよ。
0405デフォルトの名無しさん
2005/06/26(日) 21:59:33FAQかもしれないが、唯一の正解のない質問だな
そういうのはFAQ向きじゃないと思われ
0406デフォルトの名無しさん
2005/06/26(日) 22:00:340407デフォルトの名無しさん
2005/06/27(月) 00:43:59それCASL?
ST GR1, WK
ADDA GT1,WK
ってことは、ようするに GR1 を 2倍するってこと?
0408デフォルトの名無しさん
2005/06/27(月) 03:52:080409デフォルトの名無しさん
2005/06/27(月) 03:57:57相手しないように。
0410デフォルトの名無しさん
2005/06/27(月) 08:33:13EOF
0411デフォルトの名無しさん
2005/06/27(月) 15:41:43式の値を評価する際にはどうせintに拡張されるから
じゃまいか。
0412デフォルトの名無しさん
2005/06/27(月) 15:44:10アフォは黙っててください
0413デフォルトの名無しさん
2005/06/27(月) 15:56:05じゃあアフォの俺にもわかるように
おしえてけれ
0414デフォルトの名無しさん
2005/06/27(月) 15:57:31>>410
0415デフォルトの名無しさん
2005/06/27(月) 15:58:410416デフォルトの名無しさん
2005/06/27(月) 16:14:170417デフォルトの名無しさん
2005/06/27(月) 16:17:13はぁ?
こいつ、むちゃくちゃ馬鹿だ
「文字定数の型」を問題にしているのに、「文字定数以外を表せない」
ことに何か問題があるのか?
0418デフォルトの名無しさん
2005/06/27(月) 16:18:170419デフォルトの名無しさん
2005/06/27(月) 16:53:260420デフォルトの名無しさん
2005/06/27(月) 18:42:010421デフォルトの名無しさん
2005/06/27(月) 18:59:370422デフォルトの名無しさん
2005/06/27(月) 19:02:060423デフォルトの名無しさん
2005/06/27(月) 19:07:19お前の目は節穴か?
0424デフォルトの名無しさん
2005/06/27(月) 19:08:29エスケープシーケンスで判断することになると思いますが、
文字コードに依存します。
0425デフォルトの名無しさん
2005/06/27(月) 19:13:03EOFの事を言ってるなら
標準ライブラリの仕様に合わせるために言語仕様を決めたというソースは?
0426デフォルトの名無しさん
2005/06/27(月) 19:18:140427デフォルトの名無しさん
2005/06/27(月) 19:32:14単純文字定数は、型intをもつ。
と定義されてあるそれ以上でもそれ以下でもない。
0428デフォルトの名無しさん
2005/06/27(月) 19:45:370429デフォルトの名無しさん
2005/06/27(月) 19:45:43直感的にchar型でも良さそうなのに。
実際、C++だとchar型と定義されていてC言語と定義が違うし。
0430デフォルトの名無しさん
2005/06/27(月) 19:50:0244ペイジあたりを読んでみろよ。
0431デフォルトの名無しさん
2005/06/27(月) 19:53:38なんか知らないけど、困るんじゃね?
違うかな・・。
0432デフォルトの名無しさん
2005/06/27(月) 20:45:23charやshort、それらのunsignedの右辺値は常にint/unsigned intに昇格される規則があり、
int/unsigned int未満の型の右辺値は存在しないことになっているから、
文字定数の型はは昇格済みの型のintにしたのではないかと思う。
C++で文字定数がcharになったのは関数の多重定義の都合上。(shortやcharなどの右辺値も存在する)
0433デフォルトの名無しさん
2005/06/27(月) 22:01:30void main()
{
int score[6];
int sangoukei;
int goukei;
double heikin;
int i;
char kyoukaname[][30]={"国語","数学","英語","公民","世界史","理科"}
i=0;
while (i<4)
{
printf("%c:",kyoukaname[i]);
scanf ("%d",score[i]);
sangoukei +=score[i];
i++;
}
while (i<7)
{
0434デフォルトの名無しさん
2005/06/27(月) 22:01:41scanf ("%d",score[i]);
sangoukei +=score[i];
goukei +=sangoukei+score[i];
i++;
}
heikin=(double)goukei/i;
printf("3教科合計:%3d 全教科合計:%3d 平均値:%3d\n",sangoukei,goukei,heikin);
}
12行目と26行目でコンパイルエラーです。
初めて3日。独学なので質問できません。。。
どうかナイーブに直しかたおせえてくらはい。
0435デフォルトの名無しさん
2005/06/27(月) 22:05:58ソース1にデータAの中身を書き換えるプログラムを。
ソース2にはsleep( )で60秒間カウントするプログラムを作りました。
それでソース1を実行して、データAの中身を書き換えると
ソース2のsleep( )が動くようにしたいのですが、どうしたらいいでしょうか?
0436デフォルトの名無しさん
2005/06/27(月) 22:06:24まずはソース読め
質問する時は最低限エラーメッセージ書け
次に>>1を読め
そしてどっかいけ
0437デフォルトの名無しさん
2005/06/27(月) 22:14:10スレ違い
0438デフォルトの名無しさん
2005/06/27(月) 22:14:3812行目は宣言の終わりにセミコロンが無い。
残りはscanfを例えばこういう風に使ったことあるだろう。
int n;
scanf("%d", &n);
というわけでアドレス演算子を付けろ。
0439デフォルトの名無しさん
2005/06/27(月) 22:19:25遅れましたがヒントありがとうございます。
0440433
2005/06/27(月) 22:53:160441デフォルトの名無しさん
2005/06/27(月) 22:58:50{
・・・・
・・・・
・・・・
return test[0][3]
}
というようにリターンで配列を返すことってできますか?
0442デフォルトの名無しさん
2005/06/27(月) 22:59:51test は配列だけど test[0][3] は配列じゃないよ
0443デフォルトの名無しさん
2005/06/27(月) 23:01:09typedefすれば可
0444デフォルトの名無しさん
2005/06/27(月) 23:01:20test[0]を返すことが出来ますか?
と聞くべきでした
0445デフォルトの名無しさん
2005/06/27(月) 23:03:100446デフォルトの名無しさん
2005/06/27(月) 23:04:02それ本当?前半の規則については知っているけど
C言語では char の符号は処理系定義だからというのが
理由だと思ってた。
C++ の char は必ず符号ありだから
文字定数のサイズが1バイトでも問題ない
基本文字集合は必ずCでもC++でも正数だから
あー両方正しいのかな
0447441
2005/06/27(月) 23:08:09{
a=test[0][0]+test[0][1]+test[0][2];
b=test[1][0]+test[1][1]+test[1][2];
if(a>b)
return test[0];
else
return test[1];
}
このようなことをしたいと考えています
このように配列を返すことは可能ですか?
で伝わるでしょうか
0448デフォルトの名無しさん
2005/06/27(月) 23:15:030449デフォルトの名無しさん
2005/06/27(月) 23:16:00何を還したいんだ
0450デフォルトの名無しさん
2005/06/27(月) 23:16:03今X3014を読んだが、C++でもcharが符号ありかどうかは処理系定義になっている。
C++で文字定数がcharになった理由はD&Eにそう書いてある。
0451デフォルトの名無しさん
2005/06/27(月) 23:16:15int (* aaa(int test[3][3]))[3]{
return &test[0];
}
あえて書けばこうだけど、447を見る限りint *にしておくべき。
0452デフォルトの名無しさん
2005/06/27(月) 23:16:32戻り値の型をintからint *にしてみろ。
0453446
2005/06/27(月) 23:21:31C++ でも char の符号は処理系定義だったのか…
嘘言ってゴメソ
「にそう書いてある」の「そう」は>>432のことね?
D&E本買おうかな…
0454デフォルトの名無しさん
2005/06/27(月) 23:28:03ファイル名を固定せずに、任意のファイルをオープンするようにはできるのでしょうか?
0455デフォルトの名無しさん
2005/06/27(月) 23:29:13とか
0456デフォルトの名無しさん
2005/06/27(月) 23:46:24その方法でできるんですか。
ありがとうございます。
0457408
2005/06/28(火) 05:15:10まだまだ勉強が足りないようです。
細かい仕様の部分の理解が足らないみたいです。
0458デフォルトの名無しさん
2005/06/28(火) 10:18:08int n1, n2;
これはintn1,n2;では不可ですか?
また、int n1,n2;ではどうでしょうか?
スペースの使い方がよくわかりません。どなたか教えてください。
0459デフォルトの名無しさん
2005/06/28(火) 10:20:49a-zA-Z0-9_はつながってると判断されるからintn1という一つの変数(識別子)とみなされてエラーになる。
だからスペースによる区切りが必要
n1,n2は間に , があるから区切られてるとみなされて別々の扱いになる。
0460デフォルトの名無しさん
2005/06/28(火) 15:18:11たぶん>>458のintn1はたぶん間にTabがあるんだと思うよ。
判っていると思うけど
0461デフォルトの名無しさん
2005/06/28(火) 16:13:26つまずいてしいました。そこで質問なんですが
関数f(n)を
F(n)=1+3+3^2+3^3+・・・+3^n
とする時、f(n)のオーダはO(3^n)である事を証明しなさい。
誰かおわかりの方教えて下さい。
0462デフォルトの名無しさん
2005/06/28(火) 16:14:26これって危険?
0463デフォルトの名無しさん
2005/06/28(火) 16:25:53対数を取って、定数項を消去して終わりだろ。
0464デフォルトの名無しさん
2005/06/28(火) 16:39:14恐らく大丈夫だろうけれども、安全である保障はない。
strcat(str, "\n");
とか
sprintf(strchr(str, '\0'), "\n");
か
char * p = strchr(str, '\0');
p[0] = '\n';
p[1] = '\0';
とでもするのがいいのでは?
0465デフォルトの名無しさん
2005/06/28(火) 16:45:30C99ではたしか引数にristrictが付いていた気がするからまずいと思う。
>>464
一番下違和感がある。それよりもchar *p = str + strlen(str);の方が見慣れた感じがする。
こんな単純なときなら迷わずstrcat()を使うけど。
0466デフォルトの名無しさん
2005/06/28(火) 16:51:50画面に出力した行を戻るやり方ってありますか?
XPでは出来ないみたいなんですけど。
0467デフォルトの名無しさん
2005/06/28(火) 16:54:16厳密にやりたいならスレ違い。
同じ行で先頭に戻るだけでなんとかなるなら、'\r'を出力してみるとか。
0468デフォルトの名無しさん
2005/06/28(火) 17:18:00RS-232Cを使ってリモコンだらけの自宅のホームシアターをパソコンで制御出来るようにしたい
のですが、C言語でRS-232Cを制御するには一体どうしたら良いのでしょうか?
0470デフォルトの名無しさん
2005/06/28(火) 17:19:47厳密にやりたいならスレ違い。
COMをopenして読んだり書いたりしてみるとか。
0471デフォルトの名無しさん
2005/06/28(火) 19:03:47たいがいのOSではシリアルポートデバイス(WindowsならCOM1だとか)を開いて読み書きすることになるが、
ふつうはボーレート、スタート/ストップビット、パリティビット、etc....の細々した設定が必要になるんで、それだけじゃだめ。
で、その辺の設定の仕方は完全に環境依存。
0472デフォルトの名無しさん
2005/06/28(火) 19:38:59{
return ((n == 0.0 ) ? 1: n * fact(n - 1.0));
}
これの意味を教えてください
(n == 0.0 ) ? 1: の部分がよくわかりません
0473デフォルトの名無しさん
2005/06/28(火) 19:40:52それは三項演算子といって、if文みたいなもん
条件式?真の場合:偽の場合
みたいに書く
0474デフォルトの名無しさん
2005/06/28(火) 19:44:20ありがとうございます
0475デフォルトの名無しさん
2005/06/28(火) 22:04:01蛇足だけど計算誤差があるから浮動小数点数で等値比較(==)するのは危険。
fabs(n) < 0.0001 とか -0.0001 < n && n < 0.0001 とか範囲比較する方が良いと思う。
0476デフォルトの名無しさん
2005/06/28(火) 22:25:300477デフォルトの名無しさん
2005/06/28(火) 22:27:182 defg
3 hijk
-1 ****
0 1 10
0 2 34
1 2 55
2 1 28
-1 -1 0
1
上のようなデータが書かれたdatファイルがあり、これをプログラムで読み込んで、
char型 x[****より上の要素の数(この場合3)][10]
/ ヽ.
| a b c |
x | d e f g |
| h i j k .|
ヽ. /
int型 y[****より上の要素の数][****より上の要素の数]
/ ヽ.
| 0 10 34 .|
y .| 0 0 55 |
| 0 28 0 |
ヽ. /
n = 1 (←一番下にあるデータ)
のように配列に格納するようなC言語ソースファイルを作ってもらえないでしょうか?
0478デフォルトの名無しさん
2005/06/28(火) 22:33:200479デフォルトの名無しさん
2005/06/28(火) 22:58:33申し訳ないと思いながらもこちらにも書かせていただきました
0480デフォルトの名無しさん
2005/06/28(火) 23:02:470482初心者です
2005/06/29(水) 03:30:54最近C言語に興味を持ち、『10日でおぼえるC言語入門教室』と言う本を購入し、
本書どうり試してみたのですが、
E2209 sample1.c 1:インクルードファイル’stdio.h’をオープンできない
警告 W8065 sample1.c 4:プロトタイプ宣言のない関数’printf’の呼び出し(関数 main)
***1 erros in Compile ***
となってしまい、本書の3ページから進めず困ってます。(;´Д`A ```
bcc32.cfgファイルは、
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
ilink.32.cfgファイルは、
-L"c:Borland\Bcc55\lib"
本書どうりやったのですが…。。。
私の¥2,200+税…。_| ̄|○
出版社のHPに相談したのですが返信もなく、本当に泣き入ってます…。(ノДT)アゥゥ
ちなみにsample1.cファイルは、
#include <stdio.h>
main() {
printf("Hello!");
return 0;
}
です。。。
C言語にお詳しい方、お教え頂けないでしょうか?
pathの設定も、最後に;C:\Borland\Bcc55\bin加えました。
私には原因がわからないのですが…。。。
C言語にお詳しい方、助言お待ちしてます。。。m(_ _)m
0483デフォルトの名無しさん
2005/06/29(水) 03:35:04-I"c:\Borland\Bcc55\include"
のパスは合ってるの?パスの意味が分からないなら、スレ基地外い。
0484デフォルトの名無しさん
2005/06/29(水) 05:33:51bcc32.cfg.txtに一票
0485デフォルトの名無しさん
2005/06/29(水) 08:49:55http://blogs.dion.ne.jp/aceproject/archives/384603.html
0486デフォルトの名無しさん
2005/06/29(水) 10:38:46てことは、本をよく読めばどう設定すればいいのかも書いてあるんだろうが、その辺どうなの?
0487デフォルトの名無しさん
2005/06/29(水) 13:12:43BはAの約数です。と表示しそうでなければ
BはAの約数ではありません。と表示するプログラム教えてください
二つの整数を入力してください。
整数A:12
整数B:6
BはAの約数です。
こうなるようお願いします
なんか何回やってもうまくいかないんで
0488デフォルトの名無しさん
2005/06/29(水) 13:21:150489デフォルトの名無しさん
2005/06/29(水) 13:24:11判定はこんな感じでいいと思うが、どうか。
if (a % b==0){
scanfで&を忘れているみたいなオチを予想。
0490デフォルトの名無しさん
2005/06/29(水) 13:24:450491デフォルトの名無しさん
2005/06/29(水) 13:39:26スレ違い。
http://pc8.2ch.net/test/read.cgi/tech/1119514274/
http://pc8.2ch.net/test/read.cgi/tech/1119793525/
http://pc8.2ch.net/test/read.cgi/tech/1068359871/
http://pc8.2ch.net/test/read.cgi/tech/1118072681/
0492初心者です
2005/06/29(水) 15:18:50出版社の方から、.cfgファイル付きの返信がきました。
自分の作った.cfgファイルの種類はテキストドキュメントで、送って頂いた.cfgファイルはCFGファイルでした。。。
出だしつまずきましたが、これから本ともと取れる様がんばります!(`・ω・´)シャキーン
0493デフォルトの名無しさん
2005/06/29(水) 15:22:28>>484
0494デフォルトの名無しさん
2005/06/29(水) 16:10:24なにか参考になるWebページ、ライブラリなどないでしょうか?
ANSI Cだと、"string1" と "string2" の間の文字を切り出したい!
みたいなのでも、結構冗長な処理になっちゃいますよね・・・
0495デフォルトの名無しさん
2005/06/29(水) 16:11:35とりあえず真っ先に、
エクスプローラのメニューから「ツール」を選択
→「フォルダオプション」
→「表示」タブを選択
→「詳細設定」の中の「登録されている拡張子は表示しない」のチェックをオフ
しとけ。さもないと今後も同じような目にあう。
0496デフォルトの名無しさん
2005/06/29(水) 16:43:20ポインタ操作、sscanf()、snprintf()、<string.h>の関数などを適切に使い分けろ。
ただしマルチバイト文字を適切に処理するのは面倒なので、
日本語はUnicode化してワイド文字で扱ったほうがラク。
Cで文字列を扱う際に、メモリ管理がどうしても面倒になる点は、あきらめるしかない。
alloca()でいい場所では積極的にalloca()を使え。ただし非標準なので移植性には欠ける。
後は、正規表現ライブラリを使うも良し。
UNIX系OSならばPOSIX互換のものが大抵利用できるはずだが、
他のOSにも移植されており有名なのは
GNUのregex、PCRE、鬼車などかな
マルチバイト処理を考えてお勧めなのは鬼車。
ワイド文字を扱えるのは俺の知る限りboostのregexだがこれはC++用ということになる。
0497デフォルトの名無しさん
2005/06/29(水) 16:44:15bccなら専用スレがあったろう。
0498デフォルトの名無しさん
2005/06/29(水) 16:46:43>494の例だとCじゃなくても複雑だと思うが、「s1文字列のm文字目からn文字をs2文字列で置き換える」
なんて処理はCでも数行で書けるから冗長だとは思わんがなぁ。
#難解かどうかは別。
0499デフォルトの名無しさん
2005/06/29(水) 17:11:500500デフォルトの名無しさん
2005/06/29(水) 17:26:49C++は
Simula67風のオブジェクト指向とCの性能が欲しかった人が
「クラスつきのC」なるものを作ったのがはじまりで、
その後機能拡張しつづけてこんなに大きくなりました
みたいな言語です
ベースはCですが、その他にクラス、継承、テンプレート、参照、インライン関数、
演算子オーバーロード、などなどといった、よりリッチな機能を提供します
0501デフォルトの名無しさん
2005/06/29(水) 17:28:57ありがとうございます。
これから始めるならC++の方がいろいろ利点がありそうですね。
0502デフォルトの名無しさん
2005/06/29(水) 17:32:17まずはCから入った方がいいんじゃないかな。
Cの標準関数を一通り使えるようになってからC++をやってはいかが?
0503デフォルトの名無しさん
2005/06/29(水) 17:39:34Cから始める場合でもBorland C++ Compiler 5.5を使えばよろしいんでしょうか?
0504デフォルトの名無しさん
2005/06/29(水) 17:47:26というのは嘘。わざわざ遠回りせずにC++をやるがよい。
C++やる場合BCCは古いのであまりお勧めできない。
学習用ならCygwinのgccを、ツールを作るならVC++のツールキットかMingWinがよい。
0505デフォルトの名無しさん
2005/06/29(水) 17:51:070506デフォルトの名無しさん
2005/06/29(水) 18:47:27個人的にはCを一通りやってから、RubyやPythonなどの超高級言語をやった方が
いろいろ経験できてよいんじゃないかと。
アセンブラを除けば最低級と最高級に近いものをかじるわけで、
その他のC++とかはその間に位置するわけだから。
単純にC++がやりたいんなら、そのままC++をやればいいんだけど、
プログラミングをやりたいんなら、いろいろ経験するほうがいい。
0507デフォルトの名無しさん
2005/06/29(水) 18:52:05やっぱCから入った方が覚えやすい気がする。
単純にC++よりも覚えることが少なくていいと思う。
実用的な面からも、まだCでの開発は多いから、どこまでがCで、どこからがC++なのかということを把握できていいんじゃないかな。
おれは BASIC→アセンブラ→C→C++、Java、etc. の順だったけど。
0508デフォルトの名無しさん
2005/06/29(水) 18:56:39実はC++は本読んだりしたけど、本格的に使ったことは一度もない。
高級スクリプト+Cの方がいい気がしちゃうんだよね。
仕事でやってるわけじゃないからだと思うけど。
0509デフォルトの名無しさん
2005/06/29(水) 18:56:53char配列/ポインタはstd::stringよりやさしいか?
0510デフォルトの名無しさん
2005/06/29(水) 18:58:240511デフォルトの名無しさん
2005/06/29(水) 18:58:57わかりにくいけど、わかってしまえば問題を生みにくい
ってとこかな
0512デフォルトの名無しさん
2005/06/29(水) 19:16:540513デフォルトの名無しさん
2005/06/29(水) 19:17:48いいえ。
0514501
2005/06/29(水) 19:42:42OSは98なんですが、Microsoft Visual C++ Toolkit 2003はサポートしていないそうです。
98で使っている方はいらっしゃいますでしょうか?
0515デフォルトの名無しさん
2005/06/29(水) 19:47:060516デフォルトの名無しさん
2005/06/29(水) 19:58:56ポインタはC++でも重要なポイントなんだから、それをキッチリ勉強する上で C は適材じゃないかな。
文字列(メモリやポインタ)の操作なんて、学ぶところが多いでしょ。
まあ、高水準言語らしく低水準な部分は極力触らないようにするってのもいいと思うけど。
0517デフォルトの名無しさん
2005/06/29(水) 20:03:50Cygwin入れてgcc。
プログラミングに纏わる諸々の知識も身に付く代わりに敷居が高い罠。
つーか、言語相談でもコンパイラ相談でもスレ違いだ。
0518デフォルトの名無しさん
2005/06/29(水) 20:06:37C++なら本質的でない部分で随分ラクができるし
Cでしか必要でない下らないテクニックを覚える必要が無いし
手続き型的指向に染まってしまうことを回避できる
std::stringとSTL使えるだけでも随分違う。自分でリストやツリーを
作る、といったことも一度はやってみたほうが良いが、それをCで
やる必要はない。
0519デフォルトの名無しさん
2005/06/29(水) 20:11:41C++じゃ、便利なライブラリがある分、ダイレクトな理解の妨げになるかもしれない。
Cの主要ライブラリなんて、高々2、30程度なんだから、一通り見ておいてもたいした労力ではなかろ。
0520デフォルトの名無しさん
2005/06/29(水) 20:16:12誰もlibcの関数を使うなとは言ってない
libcの関数はC++の関数でもあるのだから
言語としてCをわざわざ選択する必要が無いと言ってるだけだ
0521デフォルトの名無しさん
2005/06/29(水) 20:17:08つーか、スレ違いだってばよ。
0522デフォルトの名無しさん
2005/06/29(水) 20:25:49ZZなんてたいしたことはないので、一通り見ておけ云々」
この構文を使えば、PASCALのようなキッチェなプログラミング言語を使ってる香具師を
批難したり、DMAの直接入力でOSを放り込んだりすることを今更勧めたり、
プログラマは皆量子力学を披露するべき、みたいな文章が簡単に作成できます。
キモは、何を指しているのかよくわからない、「ダイレクトな理解」。
0523デフォルトの名無しさん
2005/06/29(水) 20:29:26「Cをやるべきだ」という主張は正直中途半端で疑問が残る
いまどきC++ではなくCでなければならない仕事って、そんなに多いか?
0524デフォルトの名無しさん
2005/06/29(水) 20:36:52遅レスだがほっとけない。
うぃんどうずというもののべんきょうから
はじめましょうね、いいこだから。
0525デフォルトの名無しさん
2005/06/29(水) 20:37:230526デフォルトの名無しさん
2005/06/29(水) 20:39:22言語の使い方が人それぞれ違うんだし、
理論的にどっちがいいなんて導ける筈無いんだから。
ついでに言えば、かなりスレ違いだし(その論争専門のスレなかったっけ)。
0527デフォルトの名無しさん
2005/06/29(水) 21:24:06printfで浮動小数の%fで右寄せにするにはどうすればいいのでしょうか・・・
%f3.2みたいにしたんですがうまくできません・・・
3.00
10.23
100.00
↑
揃ってないけどここで揃えたい
0528デフォルトの名無しさん
2005/06/29(水) 21:38:09%3.2f の 3 の数字を、もっと充分な桁数にすればいいんじゃない?
とりあえず %6.2f はどうよ?
0529デフォルトの名無しさん
2005/06/29(水) 21:41:04できました!!
あなたは私の恩人です!ありがとうございます!
0530デフォルトの名無しさん
2005/06/29(水) 22:36:48なぜでしょうか?お願いします。
void open_r(FILE *fp){
char *str;
gets(str);
if((fp=fopen(str,"r"))==NULL){
puts("E1");
exit(1);
}
}
0531デフォルトの名無しさん
2005/06/29(水) 22:39:15getsを使うな。
0532デフォルトの名無しさん
2005/06/29(水) 22:43:01strの領域確保して無いじゃん
0533デフォルトの名無しさん
2005/06/29(水) 22:43:350534デフォルトの名無しさん
2005/06/29(水) 22:44:39浮動小数点演算に必ず誤差があると思ってる奴はアホ。
0535デフォルトの名無しさん
2005/06/29(水) 22:45:56詳しく
0536デフォルトの名無しさん
2005/06/29(水) 22:48:310538デフォルトの名無しさん
2005/06/29(水) 22:56:530539デフォルトの名無しさん
2005/06/29(水) 23:00:020540デフォルトの名無しさん
2005/06/29(水) 23:09:20char str[256];
とかで十分だろ。
それ以前に、その関数open_rはどこから呼ばれるのか?
FILEポインタはちゃんと渡されているのか?
0541530
2005/06/29(水) 23:15:56fgetsの場合は
fgets(str,256,stdin);
のような形でいいのでしょうか?
>>540
なるほど。
関数open_rはmainから呼ばれて
int main(void){
FILE *fp0,*fp1,*fp2,*fp3;
printf("読み込むファイルを指定してください>>");
open_r(fp0);
open_r(fp1);
・・・
のようになってます。
とりあえずfgetsつかってみます。
0542デフォルトの名無しさん
2005/06/29(水) 23:19:08fgets(str, sizeof str, stdin);の方が配列の大きさを気にせず、機械的にこうすれば良いと覚えられるので楽。
0543デフォルトの名無しさん
2005/06/29(水) 23:22:06一番アホなやり方ww
バッファが溢れた場合誤動作してしまう最悪なコーディングwww
バカ丸出しwwww
0544デフォルトの名無しさん
2005/06/29(水) 23:23:00>>539
0545530
2005/06/29(水) 23:25:16ありがとうございます。プログラムの反応が明らかに違いました。
しかし入力ファイル名はa.txtなのですが、a.txtと入力したにも係わらずなぜか開けずE1と出力されます@@
ちなみに今のopen_rはこのようになっています。
void open_r(FILE *fp){
char str[256];
fgets(str,sizeof str,stdin);
//ファイルが開けなかったらE1
if((fp=fopen(str,"r"))==NULL){
puts("E1");
exit(1);
}
}
当然a.txtは実行ファイルと同じディレクトリおいています。
0546デフォルトの名無しさん
2005/06/29(水) 23:26:590547デフォルトの名無しさん
2005/06/29(水) 23:27:54open_r()で開いたファイルポインタをmain()に返してそっちで読み書きしたいなら
FILE *open_r(void)
のようにして、戻り値として返却するか、
void open_r(FILE**)
のようにして、ポインタ渡しにしなければダメ
>>545
fgets()で読んだバッファのケツには改行文字\nがついてるから
それを切り捨てろ
0548530
2005/06/29(水) 23:28:21すいません、見落としてました@@;
っということは上の結果がE1にいってしまうのは、
\nが入っているからということですか?
0549530
2005/06/29(水) 23:30:08ありがとうございます!
0550デフォルトの名無しさん
2005/06/29(水) 23:30:13聞く前に試せボケ
0551デフォルトの名無しさん
2005/06/29(水) 23:31:19確かに整数なら桁あふれしない限り正確に表現可能だな。悔い改める。
0552デフォルトの名無しさん
2005/06/29(水) 23:33:55悔い改めるな
0553デフォルトの名無しさん
2005/06/30(木) 01:08:19void main(){
char a[20];
char *table[10];
int i,l;
for(i=0; i<8; i++){
gets(a);
table[i] = a;}
for(i = 0; i<8; i++){
printf("%s\n", table[i]);}
}
0554デフォルトの名無しさん
2005/06/30(木) 01:12:19C:\Documents and Settings\Owner\My Documents\4>char.exe
ame //キーボード入力
ika
usi
ebi
oni
kame
kiri
kuri //キーボード入力終了
ame //出力
ika
usi
ebi
oni
kame
kiri
kuri
>>553で↑のように出力されて欲しいのですが
実際はkuriが8回でて終わってしまいます。
どうしたら意図した出力結果が得られるのでしょうか?
0555デフォルトの名無しさん
2005/06/30(木) 01:15:31入門書でも買ってきたほうがいいよ。
0556デフォルトの名無しさん
2005/06/30(木) 01:22:04for(i=0; i<8; i++){
gets(a);
table[i] = a;}
↓
char table[10][20];
for(i=0; i<8; i++)
gets(table[i]);
0557デフォルトの名無しさん
2005/06/30(木) 01:28:19スレタイ嫁
無意味なレスするくらいなら消えろ低学歴
0558デフォルトの名無しさん
2005/06/30(木) 01:30:03無意味なレスするくらいなら消えろ低学歴
0559デフォルトの名無しさん
2005/06/30(木) 01:32:29無意味とは思えないな
一番的確だろ
0560デフォルトの名無しさん
2005/06/30(木) 01:36:39オウム返ししかできないようじゃやはり低学歴か
0561デフォルトの名無しさん
2005/06/30(木) 01:43:41どうしたんだ?お前、大丈夫か?
学歴コンプレックス?なに真っ赤になってんの?
0562デフォルトの名無しさん
2005/06/30(木) 01:50:04お前邪魔だから消えていいよ低学歴君
ここにいても役に立たないしな
0563デフォルトの名無しさん
2005/06/30(木) 01:52:21プププ
0564デフォルトの名無しさん
2005/06/30(木) 01:56:560565デフォルトの名無しさん
2005/06/30(木) 02:00:01PC技術系板全般で粘着荒らしが猛威をふるっています。
正しくないことが明らかな意見を肯定し続ける、煽りに便乗して中身のないレスを連投するなど症状が見られますので、ご注意ください。
0566デフォルトの名無しさん
2005/06/30(木) 02:00:020567デフォルトの名無しさん
2005/06/30(木) 02:04:100568デフォルトの名無しさん
2005/06/30(木) 02:13:00どれの事だ?
どう見てもスルーできない馬鹿が原因だな
わざとであろうけれど
0569デフォルトの名無しさん
2005/06/30(木) 02:21:210570デフォルトの名無しさん
2005/06/30(木) 02:42:290571デフォルトの名無しさん
2005/06/30(木) 02:45:01何が良なんだ?
0572痔々ぃ
2005/06/30(木) 06:40:57最近のプログラマは費用とか考えないのだろうか・・・
0573デフォルトの名無しさん
2005/06/30(木) 17:12:52y = a*x^6 + b*x^5 + c*x^4 + d*x^3 + e*x^2 + f*x + g
という6次式に近似して、それぞれの係数a,b,c,d,e,f,gを表示するような
数値計算プログラムが組みたいのですが、曲線近似なんてしたことないので
どうしたらいいのか分かりません。教えてください。
xy
───────
21265
21366
21468
21568
21668
21768
21875
21992
220138
221202
222209
223211
224216
225219
226221
───────
0574573
2005/06/30(木) 17:15:10x y
───────
212 65
213 66
214 68
215 68
216 68
217 68
218 75
219 92
220 138
221 202
222 209
223 211
224 216
225 219
226 221
0575デフォルトの名無しさん
2005/06/30(木) 17:53:38そりゃCの問題ではないんでないかい?
0576デフォルトの名無しさん
2005/06/30(木) 18:07:263次なら兎も角、6次式ってかなり無理がある気がするけどね。
点数少ないし。
0577デフォルトの名無しさん
2005/06/30(木) 18:33:23やりたいのは、
MYMACRO(fmt, ...)
を
printf("%s(%d): " fmt, __FILE__, __LINE__, ...)
みたいに展開することです。
MYMACRO("%s の点数は %d点です", name, pts);
とやれば
printf("%s(%d): " "%s の点数は %d点です", __FILE__, __LINE__, name, pts);
というようにです。
なおこのマクロでは、展開の都合で fmt は文字列定数という制限が付くことになります。
0578デフォルトの名無しさん
2005/06/30(木) 18:39:51無理。
類似品として、MYMACRO((...))でいいのならなんとかなる。
#つまり、フォーマット文字列から先を全部纏めて置換するわけ屋根。
0579577
2005/06/30(木) 18:45:13やっぱり無理ですか。
ところでその代替案は、つまり
#define MYMACRO(arg) printf("%s(%d): ", __FILE__, __LINE__); printf(arg)
と定義して、
MYMACRO(("%s の点数は %d点です", name, pts));
みたいに使うということですか?
0580577
2005/06/30(木) 18:48:40#define MYMACRO(arg) printf("%s(%d): ", __FILE__, __LINE__); printf arg
ですね?
0581デフォルトの名無しさん
2005/06/30(木) 19:19:52んですが、どうすればいいんですか?
0582デフォルトの名無しさん
2005/06/30(木) 19:45:09その通りにすればいいのでは?
それぞれのステップで何をすればいいのか判らないなら初心者スレへ、
丸投げしたいなら宿題スレへどうぞ。
0583デフォルトの名無しさん
2005/06/30(木) 21:02:52snprintfでは「書き出すのに必要な文字数」であって「実際に書き出された文字数」ではないのですか?
例:
r=snprintf(aBuff, 2, " %d", -987);
で結果は
r=5,aBuff={' ','\0',・・・}
になるのですが・・・
0584デフォルトの名無しさん
2005/06/30(木) 21:11:25C99 なら OK。
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00053.html
すれ違いだが gcc などは独自にそういう機能を提供していた。
0585デフォルトの名無しさん
2005/06/30(木) 22:05:43渡したバッファ長より出力が長い場合は、バッファへの出力は打ち切られるけど戻り値は打ち切られなかったときの
サイズが返るんじゃない?
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/snprintf.3.html
>出力が切り詰められた場合には、もし十分なスペースがあれば書き込まれたであろう文字の個数 (文字列の終端にある '\0' を除く) を返す。
0586デフォルトの名無しさん
2005/06/30(木) 22:50:22を使えないんです。原因分かる方ヘルプゥゥ!
もちろんprocess.hしてます。
・・・・・コンパイラメッセージ・・・・・・
warning C4013: 関数 '_beginthread' は定義されていません。
0587デフォルトの名無しさん
2005/06/30(木) 23:14:00スレ違い。
つーか、マルチすんな。
0588デフォルトの名無しさん
2005/07/01(金) 00:02:36//p[3][4]っぽくしたい
int **p = (int **)malloc(sizeof(int *) * 3);
for(i = 0; i < 3; i++) p[i] = (int *)malloc(sizeof(int) * 4);
このようにしたのですが要素のアドレス的な連続性がないです。(p[0][3]の次がp[1][0]になってない。)
なので、
for(j = 0; j < 3; j++){
for(i = 0; i < 4; i++){
p[j][i] = i + (j*4);
printf("%d, \n", *((*p) + i + (j*4)));
}
}
のようにした場合に、p[j][i]に値は入るのですが、*((*p) + i + (j*4))では同じ位置を指してくれません。
p[j][i]も*((*p) + i + (j*4))も使えるように二次元配列を動的に割り当てることは出来るのでしょうか?
0589デフォルトの名無しさん
2005/07/01(金) 00:06:41int (*p)[4] = (int (*)[4])malloc(sizeof(int) * 3 * 4);
0590デフォルトの名無しさん
2005/07/01(金) 00:07:290591デフォルトの名無しさん
2005/07/01(金) 00:11:48動的じゃなくね?
0592デフォルトの名無しさん
2005/07/01(金) 00:14:00int (*p)[n] = (int (*)[n])malloc(sizeof(int) * 3 * n);
とかできないじゃん
0593デフォルトの名無しさん
2005/07/01(金) 00:20:59{
void **p = malloc(sizeof (void *) * x);
void *pY = malloc(size * x * y);
size_t i;
for (i = 0; i < x; i++)
p[i] = pY + i * y;
}
void Free2(void **pp)
{
free(*pp);
free(pp);
}
こう使える。
int **p = (int **)Alloc2(3, 4, sizeof (int));
// >>588の後半
Free2((void **)p);
0594デフォルトの名無しさん
2005/07/01(金) 00:21:30ってことかな?
0595デフォルトの名無しさん
2005/07/01(金) 00:22:08覚えたての配列へのポインタが使いたくて仕方がなかったんだよ >>589は
0596デフォルトの名無しさん
2005/07/01(金) 00:23:23それ、二つの領域をつなげてallocするとfreeの手間がラクになりそうだが
alignさせるのがちょっと面倒か
0597デフォルトの名無しさん
2005/07/01(金) 00:28:49こうか?
size_t IndexSize = sizeof (void *) * x;
void **p = malloc(IndexSize + size * x * y);
void *pY = p + IndexSize;
ところでAlloc2()、return書き忘れた……。
○| ̄|_
0598デフォルトの名無しさん
2005/07/01(金) 00:31:180599デフォルトの名無しさん
2005/07/01(金) 00:31:45それだと、doubleの配列とかで問題になるだろ
0600デフォルトの名無しさん
2005/07/01(金) 00:31:53コンパイル通らないなぁ、なんでだろ?
0601デフォルトの名無しさん
2005/07/01(金) 01:05:24宣言前でmalloc呼んでるからじゃね?
0602デフォルトの名無しさん
2005/07/01(金) 01:08:220603デフォルトの名無しさん
2005/07/01(金) 01:10:05言いたくなるな
0604デフォルトの名無しさん
2005/07/01(金) 01:15:29error C2036: 'void *' : サイズが定義されていません。
0605デフォルトの名無しさん
2005/07/01(金) 01:26:30そうやって逃げてちゃウデは上がらないでしょ。
0606デフォルトの名無しさん
2005/07/01(金) 01:33:04こういうのは不要なウデだと思うんだがなあ
0607デフォルトの名無しさん
2005/07/01(金) 01:34:180608デフォルトの名無しさん
2005/07/01(金) 02:05:040609デフォルトの名無しさん
2005/07/01(金) 05:18:53p[i] = (int *)pY + i * y;
とかにしなきゃ無理?
0610デフォルトの名無しさん
2005/07/01(金) 05:34:36%09.9f の.9の部分は何をどう表してるんですか?
^^
もし変換指定子がdなら.9は省略してもおkですか?
自分が持ってる本には、「表示する最小の桁数を指定します。省略した場合は、整数の場合は1であるとみなされます」とあります。
教えてくださいorz
0611610
2005/07/01(金) 06:47:54すいません
0612デフォルトの名無しさん
NGNGたとえば数値が 12.34567 だとすると
%.9f なら 12.345670000 ってなるし
%.3f なら 12.346 ってなる。
小数点の左側は全体の表示桁数ね。
%09.3f なら 00012.346 ってなる。
%dなら小数点はいらない。っていうか普通付けない。
0613610
2005/07/01(金) 14:13:28よく分かりました!
ありがとうございましたm(__)m
0614デフォルトの名無しさん
2005/07/01(金) 15:51:16#include?<math.h>
double?f(double?a,?double?p,?double?x)
{
??return?(exp(-x*x/(2.0*a*a))*cos(3.14*x+p));
}
int?main()?{
??double?a,?p,?x;?
a=0.6;
p=0.0;
??for(x=-3.14;x?<=?3.14;x+=0.01)?{
????printf("%.2f , %f\n",?x,?f(a,?p,?x));
???}
??return?0;
}
gnuplotでこのプログラムのグラフを表示させたんですが、上手くいきません。
どこを直せばいいと思いますか?
0615デフォルトの名無しさん
2005/07/01(金) 15:52:550616デフォルトの名無しさん
2005/07/01(金) 16:06:10修正しました。
#include?<math.h>
double?f(double?a,double?p,double?x)?{
??return?(exp(-x*x/(2.0*a*a))*cos(3.14*x+p));
}
int?main()?{
??double?a,?p,?x;
??a=0.6;
p=0.0;
??for(x=-3.14;x?<=?3.14;x+=0.01)?{
????printf("%f , %f\n",?x,?f(a,?p,?x));
??}
??return?0;
}
0617デフォルトの名無しさん
2005/07/01(金) 16:19:410618614〜616
2005/07/01(金) 16:20:33すいません、僕の書き込みは無視してください。
お騒がせしてすいませんでした。
0619デフォルトの名無しさん
2005/07/01(金) 17:29:26gnuplotがダメならExcelで試してみるとか。
まぁ、いずれにしてもCの話じゃない罠。
0620デフォルトの名無しさん
2005/07/01(金) 22:01:21これはどういう意味でしょうか?
0621デフォルトの名無しさん
2005/07/01(金) 22:03:22コードを見せろ。
0622デフォルトの名無しさん
2005/07/01(金) 22:11:07・括弧の対応が合ってない
・ifが無いのにelseがある
0623デフォルトの名無しさん
2005/07/01(金) 22:13:06そんなわかりやすいコンパイルエラーなんだから少しは分かれよ
コンパイラがかわいそうだ
0624デフォルトの名無しさん
2005/07/01(金) 22:17:170625デフォルトの名無しさん
2005/07/01(金) 22:18:070626デフォルトの名無しさん
2005/07/01(金) 22:19:502chが読めるんならこの程度の日本語は読めるとおもわれ
0627デフォルトの名無しさん
2005/07/01(金) 22:51:58a[0]=3.14
a[1]=1.23
a[2]=2.34
・・・・
と配列に入っています(実数で)
これをテキストファイルに出力したいのですが本に載ってるやり方で出来ませんでした
intからdoubleうんちゃらかんちゃらとかよくわかんないです
整数データじゃないと出力できないんでしょうか?
0628デフォルトの名無しさん
2005/07/01(金) 22:53:42for (i = 0; i < N; ++i)
printf("%f ", a[i]);
とかで出力できんのか
0629627
2005/07/01(金) 22:54:40ファイルに書き出したいんです
0630デフォルトの名無しさん
2005/07/01(金) 22:55:13でリダイレクトしろ。
0631デフォルトの名無しさん
2005/07/01(金) 22:56:33リダイレクトでもいいし
fp = fopen("out.txt","w");
としたあとで
printf(...)のかわりにfprintf(fp,...)を使えばよい
0632デフォルトの名無しさん
2005/07/01(金) 22:57:330633627
2005/07/01(金) 23:09:36本にはfputsが載っていてそれだとエラーでした
リダイレクトは知っているのですが、そのほかにも大量に色々計算していて
最終的に結果のみを出力したかったので質問しました
(リダイレクトしてテキスト開いて結果だけコピーして・・・というの面倒なので)
またエラーでたら来ます
0634デフォルトの名無しさん
2005/07/01(金) 23:27:15エラー出たら来るじゃなくて、考えてわからなかったら来いや…
0635デフォルトの名無しさん
2005/07/01(金) 23:30:56Γ→�凵AC/Γ→�凵AC∨D
および
Γ→�凵AD/Γ→�凵AC∨D
となるプログラムをCで表してほしいです。
0636デフォルトの名無しさん
2005/07/01(金) 23:33:530637588
2005/07/01(金) 23:45:460638前スレ392
2005/07/02(土) 08:05:50どうもありがとうございました。m(_ _)m
0639デフォルトの名無しさん
2005/07/02(土) 10:21:07この本で勉強したヤツらはみんな、
正解なのか不正解なのか分からないまま
ムンムンとした欲求不満状態で読み進めていったのか?
0640デフォルトの名無しさん
2005/07/02(土) 10:35:560641デフォルトの名無しさん
2005/07/02(土) 10:45:48多次元配列 int* a[51][10]
をある関数に引数として渡したいのですが、
func(int[][] a)としたらコンパイルエラーとなりました。
どうすればいいのでしょうか?
よろしくお願いします。
0642641
2005/07/02(土) 10:49:030643641
2005/07/02(土) 10:57:12ポインタのポインタですね。
失礼しました。
0644デフォルトの名無しさん
2005/07/02(土) 11:02:050645デフォルトの名無しさん
2005/07/02(土) 11:14:13VC Toolkit, gcc, LSI Cなどいろいろある。
0646テンプレ抜けてたね・・・
2005/07/02(土) 11:14:35【コンパイラ】
gcc
http://gcc.gnu.org/
【Win32用の開発環境のみ。】
gcc-cygwin
http://www.cygwin.com/
gcc-mingw
http://www.mingw.org
Digital Mars C++
http://www.digitalmars.com/
Open Watcom
http://www.openwatcom.com/
Borland C++ Compiler 5.5.1
http://www.borland.co.jp/cppbuilder/freecompiler/
Visual C++ Developer Center: Microsoft Visual C++ Toolkit 2003
http://msdn.microsoft.com/visualc/vctoolkit2003/
【ライセンスや機能などに問題あり】
Microsoft C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/
LCC-Win32
http://www.cs.virginia.edu/~lcc-win32/
CINT
http://root.cern.ch/root/Cint.html
めじろ++98
http://www.vector.co.jp/soft/win95/prog/se075910.html
Intel C++ Compiler for Linux
http://developer.intel.com/software/products/compilers/clin/noncom.htm
0647デフォルトの名無しさん
2005/07/02(土) 11:28:12それだと a[y][x] みたいな使い方をしたときに、おそらく期待した動作をしないよ。
>>276 >>279 >>281 ・・・ >>288 ・・・ あたりの一連は参考になるかな。
とどのつまり、func(int (*a)[10]) と定義して a[y][x] と使うか、
func(int (*a)[51][10]) と定義して (*a)[y][x] として使うかのどっちかかな。
意味的な違いで使い分ければいいと思う(int[10] の行の集合を指し示すポインタなのか、int[51][10] の二次元の塊を指し示す
ポインタなのかってこと)。
a++ ってやったときに、前者の定義だと y が一つ進んだポインタになるし、後者の定義だと次の int[51][10] のメモリブロックを
指すポインタになる。
0648デフォルトの名無しさん
2005/07/02(土) 11:32:51func(int (*a)[51][10])だと、func(&a);としなければならない。
0649デフォルトの名無しさん
2005/07/02(土) 11:34:170650デフォルトの名無しさん
2005/07/02(土) 11:46:33だからそれが意味的な違いって言うことだよ。
int[51][10] の領域を一つの実体としたデータ構造なら、&a とやって渡すのが妥当だじゃないか?
実際構造体もそうなわけだし。
typedef int BOKE[51][10]
と定義したタイプがあったとすれば、その実体は
BOKE x;
だし、それを受け取る関数は
func(BOKE *a)
だし、それにポインタを渡すなら func(&x) でしょ。
二次元配列丸ごと全部で一つのデータ構造なのであれば二次元配列を指し示すポインタとして、一次元配列の
集合というデータ構造ならば一次元配列を指し示すポインタとして定義するべきだと思う。
たとえばコンソール画面の内容を二次元配列に入れてたとして、その画面を何画面も持ちたいときなんかを
考えれば、a++ とやったときにポインタが一行進むべきなのか一画面進むべきなのか、どちらが妥当か?
という問題だと思う。
0652デフォルトの名無しさん
2005/07/02(土) 15:34:520653デフォルトの名無しさん
2005/07/02(土) 15:48:460654デフォルトの名無しさん
2005/07/02(土) 17:24:30行ってきたのですが、C#とかC++とかあって何を買う方がいいのか
迷いました。
この2つの違いとボーランドとマイクロソフトはどちらを買えばいいのか
ご教授ください。
0655デフォルトの名無しさん
2005/07/02(土) 17:26:33悲しくなるほどスレ違い。それらはどちらも「C」ではない。
0656デフォルトの名無しさん
2005/07/02(土) 17:40:550657デフォルトの名無しさん
2005/07/02(土) 17:48:53C++コンパイラは普通Cもコンパイルできる
C#コンパイラは普通Cはコンパイルできない
CをやりたいんならC++用の開発環境を探しなさい
0658デフォルトの名無しさん
2005/07/02(土) 18:34:190659デフォルトの名無しさん
2005/07/02(土) 18:51:52ご丁寧なお返事ありがとうございます。
CとC++とC#の違いを教えて下さい。
0660デフォルトの名無しさん
2005/07/02(土) 18:58:18C++ 元はCへSimulaのオブジェクト指向を加えたい、ということから始まった。
Cユーザを引き連れたいということで、Cのソースは基本的にそのままC++でも使える。
0661デフォルトの名無しさん
2005/07/02(土) 19:02:59C言語やりたいだけなら、製品買わなくても、>>646 で十分
0662デフォルトの名無しさん
2005/07/02(土) 19:03:34exit();
するときに、
exit(1);
ではなく、stdlibの"EXIT_FAILURE"を使い
exit(EXIT_FAILURE);
としたほうが、汎用的になる
とあるのですが、意味が書いてありません
検索してみても、意味の記述はありませんでした
どのような意味で、どのような利点があるのでしょうか?
0663デフォルトの名無しさん
2005/07/02(土) 19:05:03C++はCのスーパーセット(上位互換)と思っていれば大体間違いはない。
つまり根っこは同じで、Cに色々と仕様を追加して拡張された言語だ。
だから、C++用の開発環境は通常Cも扱えるし、扱う。
C#は構文的にC系統の言語を受け継いではいるものの、全く別物の言語。
0664デフォルトの名無しさん
2005/07/02(土) 19:07:06俺的には利点は全く無いな。
exitに渡したいのは0/1だけじゃないし、
EXIT_SUCCESSやEXIT_FAILUREは規格で0/1と定められているから、
何かを隠蔽しているわけでも環境によって値が変わるわけでもない。
0665デフォルトの名無しさん
2005/07/02(土) 19:10:19グローバル変数を使おうと思ったのですが数が多いので
グローバル変数を使わずにできる方法等あれば教えてほしいです
どうかよろしくお願いします
0666デフォルトの名無しさん
2005/07/02(土) 19:11:48ありがとうございます。
タダで使えるBorland C++ Part4
http://pc8.2ch.net/test/read.cgi/tech/1091066805/
これを今DLしました。
良かった、今日ヨドバシで買わなくて良かった。
>>663
なるほど、それじゃC++にしておけばCも含んでいるんですね。
「Borland C++ Compiler 5.5 無償ダウンロード」と製品版の違いは
何なんでしょうか?
0667デフォルトの名無しさん
2005/07/02(土) 19:13:49構造体でも使ったらどうだ。
struct param { int a, char *b, ... };
void set(struct param *p) { p->a = 1; p->b = "hello"; }
void get(struct param *p) { printf("%d %s\n", p->a, p->b); }
とかそんなかんじだ。
0668デフォルトの名無しさん
2005/07/02(土) 19:29:44製品版てのは C++ Builder とかじゃない?
これは、Windowsアプリ開発のためのGUIエディタとか、
デバッガとかが入った統合環境。
って、これはもうスレ違いな質問
0669デフォルトの名無しさん
2005/07/02(土) 19:56:42本当にありがとうございました。
向こうのスレで聞いてみます。
Cのこと何も知らない癖に出来ますって言って
就職活動してるんです。
0670デフォルトの名無しさん
2005/07/02(土) 19:59:03おまえの人生そこで終わりだ
マをなめるな
0671デフォルトの名無しさん
2005/07/02(土) 19:59:44そうか
がんばれよ!
で、デスマ要員になってさっさと死ね
0672デフォルトの名無しさん
2005/07/02(土) 20:05:030674デフォルトの名無しさん
2005/07/02(土) 20:36:53Cの標準的な関数の使い方を一通り眺めれば、どんな風にするとうまくいきそうかわかるんじゃないかい?
たとえば strcpy なんかは、内部で文字列のコピーを作って、呼び出し元の変数に値を返してるとも考えられる。
localtime なんかは、内部で展開した各種値を構造体に返すようにできてる。
ようは、呼出元に値の返却先を用意して、関数はその領域に対して値を格納するように作るのが一般的。
0675665
2005/07/02(土) 20:39:33->の矢印は.と同位なんですかね?
それと、他にも質問があるのですが
struct param { int a, char *b, ... };
の場合
param *pは最初にmain関数で宣言するのですよね?
そしたら、
void hoge(struct param *p)とすることでどこからでも呼び出せるということでしょうか?
この場合、hogeを呼び出すにはmain関数内で
hoge(*p);
とするのでしょうか?
始めたばかりでよくわからないのですが教えていただけると幸いです
0676デフォルトの名無しさん
2005/07/02(土) 20:41:47構造体なんて、使ってみればそう難しくないさ。
typedef struct {
int add;
int sub;
int mul;
int div;
} ANSWER;
void calc(int a, int b, ANSWER *pans)
{
pans->add = a + b;
pans->sub = a - b;
pans->mul = a * b;
pans->div = a / b;
}
int main()
{
ANSWER ans;
calc(1000, 100, &ans);
printf("1000 + 100 = %d\n", ans.add);
printf("1000 - 100 = %d\n", ans.sub);
printf("1000 * 100 = %d\n", ans.mul);
printf("1000 / 100 = %d\n", ans.div);
return 0;
}
0677デフォルトの名無しさん
2005/07/02(土) 20:44:51->と . は順位が同じというだけでもちろん意味は違う。
0678デフォルトの名無しさん
2005/07/02(土) 20:46:59struct は、typedef して使うと扱いやすいよ。
>>676 のサンプルを参照。
こうしておくと、ANSWER っていう型でコードを記述できるから、ラクチン。
-> は、その左側が構造体へのポインタの場合に使う。
p->x は (*p).x と同じ。
>>676 では、関数 func は ANSWER をポインタで扱ってるから、それに対してアクセスするのに -> を使ってる。
main では、ANSWER の実体を扱ってるから、それに対してアクセスするのに . を使ってる。
0679デフォルトの名無しさん
2005/07/02(土) 20:47:45. と -> の違いをどう説明するか
0680678
2005/07/02(土) 20:48:01○ 関数 calc
0681665
2005/07/02(土) 20:51:29よくわかりました!!
0682デフォルトの名無しさん
2005/07/02(土) 20:51:410683デフォルトの名無しさん
2005/07/02(土) 20:52:140684デフォルトの名無しさん
2005/07/02(土) 21:03:44なんか、考えてみるとそうだった気がしてきた
いま書いてるコード自分で初期化してるや
0685デフォルトの名無しさん
2005/07/02(土) 21:06:21されません。
0686デフォルトの名無しさん
2005/07/02(土) 21:06:55どんな型でも初期化子が存在すればそれで初期化される。
そうでない場合、グローバル・staticなら0で初期化され、自動変数なら初期化されない。
0687デフォルトの名無しさん
2005/07/02(土) 21:09:28グローバル・static なら 0 で初期化されるって、保証されてるの?
0689デフォルトの名無しさん
2005/07/02(土) 21:16:00見たいな感じで初期化したいのですが
0以外で初期化するには何がありますか?
int a=NULL;
とかでも、初期化されてるんですか?
0690デフォルトの名無しさん
2005/07/02(土) 21:16:02ans は calc の結果返却先だから、初期化されてる必要は無いでしょ。
0691デフォルトの名無しさん
2005/07/02(土) 21:18:37int a=3;
0692689
2005/07/02(土) 21:22:49初期化と言う言葉はてきとうじゃなかったですね
0とかnullにしたいです
0693デフォルトの名無しさん
2005/07/02(土) 21:26:15の何が不満なのか。
0694689
2005/07/02(土) 21:27:18nullとかでできるならそっちのほうがいいと思いまして
0695デフォルトの名無しさん
2005/07/02(土) 21:28:05そのライブラリは、使用に先立って初期化処理をしておく必要があります。
普通このような初期化処理は、ライブラリを使うプログラムが明示的に呼び出すものだと思います。
しかしそうではなく、リンクしただけで実行の際に自動的に初期化処理が走るようにすることはできないでしょうか。
また同様に、プログラム終了時の後始末処理を自動で行うようにはできないでしょうか。
(これは、初期化処理が自動で走りさえすれば、そこで atexit ハンドラを登録することで何とかできそうですが)
ところで libc なんかは、内部的な初期化処理というのは行っていないのでしょうか?
0696デフォルトの名無しさん
2005/07/02(土) 21:32:290697デフォルトの名無しさん
2005/07/02(土) 21:33:39#define INIT_VALUE 0
a = INIT_VALUE;
とでもすればいい。
慣習的に、NULLはポインタに対して使われるものなので、
整数に対して使うのはお勧めできない。
0698デフォルトの名無しさん
2005/07/02(土) 21:33:480699デフォルトの名無しさん
2005/07/02(土) 21:35:19そんなのもお勧めできないだろ。
a = 0に慣れる以外に道はない。
0700デフォルトの名無しさん
2005/07/02(土) 21:47:53libcの内部的な初期化というのは大抵行われていると思っていいがその段階で何らかの関数を呼び出させるというのは無理。
C++が使えるのなら非公開のクラスを作って、そのコンストラクタで1通りの初期化をし、その型のグローバル変数をを無名名前空間に置くなんて技が使えるけど。
0701デフォルトの名無しさん
2005/07/02(土) 22:08:49エラー出して自衛するしかないな。
0702デフォルトの名無しさん
2005/07/02(土) 22:12:13ライブラリロード・アンロードのラッパ関数作って、
そこで初期化関数呼び出せばいいんじゃない?
ELFならinitとfinitをexportすればいいだろうけど。
0703デフォルトの名無しさん
2005/07/02(土) 22:13:57まあ何にせよ環境依存だ
0704デフォルトの名無しさん
2005/07/02(土) 23:13:31int main(int argc, const char **argv){
として、引数を取得しているのですが
その引数の評価をoptionという関数でやろうと思い
int option(int argc, char **argv){
として、うけとり評価をしようと思っているのですが
optionを呼び出す際になんと呼び出せばいいのでしょうか?
option(argc, argv);だと
warning: passing arg 2 of `option' from incompatible pointer type
と、いわれます
ポインタと言うのがよくわからないのですが
この場合ワーニングを出さないにはどのように書けばいいのでしょうか?
0705デフォルトの名無しさん
2005/07/02(土) 23:16:11int main(int argc, const char **argv)
→int main(int argc, char **argv)
0706695
2005/07/02(土) 23:18:04いろいろなアドバイスありがとうございました。
0707デフォルトの名無しさん
2005/07/02(土) 23:19:28むしろ option の方に const を付けるのがいいんじゃないか?
0708704
2005/07/02(土) 23:21:09constしてるのにconstしてない変数に代入してっぞって意味でしたか
0709デフォルトの名無しさん
2005/07/02(土) 23:26:39どっちでもいい。argvはconstである必要はないし、そうであってもいいから。
0710デフォルトの名無しさん
2005/07/02(土) 23:41:50こういうプログラムを作ったのですが、入力のところがうまくいきません。
名前を入力しようとすると、名前の入力が飛ばされて、住所の入力に行ってしまいます。
原因は\nかなにかが入力されていることになってしまっていると思うんですが、
解決方法が分かりません。
解決方法をよろしくお願いします。
0711デフォルトの名無しさん
2005/07/02(土) 23:47:51空のfgets発行するか、scanfに\n追加するか、rewind(stdin)しとけ。
0712デフォルトの名無しさん
2005/07/02(土) 23:49:37http://www.kouno.jp/home/c_faq/c12.html#18
たぶん"%d%*[^\n]%*c"とでもすれば良かったと思う。
あとgets禁止。
http://www.kouno.jp/home/c_faq/c12.html#23
0713デフォルトの名無しさん
2005/07/02(土) 23:52:02マジックナンバーを使うなとは欲いうが
まったくもって意味がわかってないと見えるな
0714710
2005/07/03(日) 00:09:51ありがとうございます。出来ました。
学校の課題で、scanfとgetsしか基本的に使っていないので、
getsを使用せざるを得ないので...
713
それは自分に対するレスですか?
マジックナンバーは最初から課題で指定されているので。
0715デフォルトの名無しさん
2005/07/03(日) 00:12:09MとかNじゃ、マジックナンバーを避けたことになっていない。
適切な名前を与えることによって初めてマジックナンバーを避けたことになる。
0716デフォルトの名無しさん
2005/07/03(日) 00:13:41>getsを使用せざるを得ないので...
習ったものしか使えない?チミは高校生かね?
宿題ならスレ違いだし。
0717710
2005/07/03(日) 00:52:56MとかNは最初からそうするように指定されているので。
>>716
そういう意味じゃないですが、説明するのが面倒なので省略します。
まあ、とにかく、ありがとうございました。
0718デフォルトの名無しさん
2005/07/03(日) 00:57:420719デフォルトの名無しさん
2005/07/03(日) 01:20:11どっちでもいいってか、option がどういう関数か、ってことだろ?
option が渡されたポインタが指す領域を書き換えないなら const を付けるべきだと思うが、いかがか?
0720デフォルトの名無しさん
2005/07/03(日) 01:22:240721デフォルトの名無しさん
2005/07/03(日) 01:51:25両方の選択枝を提示してあとはご勝手にって言うのが筋だと思う。
0722719
2005/07/03(日) 02:24:50コンパイルが通すことが目的ならそれでいいんだろうけど、
せっかくキーワードを付ける付けないが絡んで出てる問題なんだから、おれは正確な定義をするためのアドバイスをしたいな。
main の argv は慣例に則って const は付けなかったとしても、option の引数にはぜひとも const を付けていただきたいところ。
つーか、入力のみの変数なのに const を付けないプログラマが多くて、一緒に仕事すると萎えるって現状があるから
余計そう思ってるだけかもしれないけど。
0723デフォルトの名無しさん
2005/07/03(日) 02:35:000724デフォルトの名無しさん
2005/07/03(日) 02:49:430725デフォルトの名無しさん
2005/07/03(日) 02:55:39int getopt(int argc, char * const *argv, const char *optstring)
だったりするんだよな
(**argvは書き換えないが*argvは書き換える)
>>704はconstをよく理解していないようだし、自分で全部説明して
面倒見る気なら構わないが、そうでなければ悪戯に混乱させるだけじゃ
なかろうか。
0726デフォルトの名無しさん
2005/07/03(日) 02:55:41const が二個着いてるがこれ大丈夫なの?
0727デフォルトの名無しさん
2005/07/03(日) 02:58:510728デフォルトの名無しさん
2005/07/03(日) 03:01:57VCが甘いだけで、実際には規格外じゃなかった?
0729デフォルトの名無しさん
2005/07/03(日) 03:03:31説明したけりゃ回りに突っかからずに704に説明すればいいだけの話では。密度の薄いスレだなー
0730デフォルトの名無しさん
2005/07/03(日) 03:07:320731デフォルトの名無しさん
2005/07/03(日) 03:07:420732デフォルトの名無しさん
2005/07/03(日) 03:09:170733デフォルトの名無しさん
2005/07/03(日) 03:13:47俺は「説明したい」ワケじゃないし、別に周りに突っかかってない。
「constにこだわりたい」といってるのは>>719だ
0734719
2005/07/03(日) 03:19:46option の定義についての一つの話題として意見を書いたつもりだったんだけど、おかしなこと言ってた?
0735>>709,721
2005/07/03(日) 03:21:56はい次次!
0736デフォルトの名無しさん
2005/07/03(日) 03:22:08し
て
い
ま
す
0737デフォルトの名無しさん
2005/07/03(日) 03:22:340738デフォルトの名無しさん
2005/07/03(日) 03:24:230739デフォルトの名無しさん
2005/07/03(日) 03:25:20main の定義の話ではないのでは?
0740デフォルトの名無しさん
2005/07/03(日) 03:26:230741デフォルトの名無しさん
2005/07/03(日) 03:29:320742デフォルトの名無しさん
2005/07/03(日) 03:30:13意味が全然わかってないひと
0743デフォルトの名無しさん
2005/07/03(日) 03:32:13その他の関数の引数にconstを付けるかどうかの話じゃないんだっけ
勘違いしてたらスマソ
0744デフォルトの名無しさん
2005/07/03(日) 03:36:49関数Aがポインタ引数の参照先を書き換えないのであれば、
そのポインタ引数はconst修飾すべきである
という、一貫してそれだけの話をしている。main()は関係ない。
0745デフォルトの名無しさん
2005/07/03(日) 03:36:52const char * const * const a = NULL;
char * const * const b = NULL;
const char ** const c = NULL;
a = NULL; // NG
*a = NULL; // NG
**a = NULL; // NG
**b = NULL; // OK
*b = NULL; // NG
b = NULL; // NG
**c = NULL; // NG
*c = NULL; // OK
c = NULL; // NG
const って不思議だな・
0746デフォルトの名無しさん
2005/07/03(日) 03:42:15char に NULL を代入するのはいかがかと
0747デフォルトの名無しさん
2005/07/03(日) 03:42:500748デフォルトの名無しさん
2005/07/03(日) 03:48:06それは元の質問から派生した、どちらかというとどうでもいい内容じゃないかな?
0749デフォルトの名無しさん
2005/07/03(日) 03:49:29よしキタ!
NULLより 0 の方がいい
http://homepage3.nifty.com/~masumoto/cpp/topic/#RSEC3
0750デフォルトの名無しさん
2005/07/03(日) 03:56:54return 333;
}
メインの戻り値は、どうせ使われていないので、何でも良いと
とあるお方に聞いたのですが、これは正しいのでしょうか?
「シェルを使う時は気にする必要がある」とよく見かけますが、
シェルがどーのとか言うのは良く解らないので、知識に溢れる方
の意見を伺いたいです。
0751デフォルトの名無しさん
2005/07/03(日) 04:00:11NULLが0じゃない処理系があるなんて、すっかり忘れてた。
ポインタを if(p) { ・・・} なんて評価しちゃうこと、よくあるな・・・
気をつけよう。
0752デフォルトの名無しさん
2005/07/03(日) 04:02:33ポインターがヌルポインターでないかどうかのテストの省略形 「if(p)」は有効なのか? ヌルポインターの内部表現が0でない場合は どうなるのか。
0753デフォルトの名無しさん
2005/07/03(日) 04:03:12,、‐ ''"  ̄ ``'' ‐- 、
/イハ/レ:::/V\∧ド\
/::^'´::::::::::::i、::::::::::::::::::::::::::::\
‐'7::::::::::::::::::::::::ハ:ハ::|ヽ:::;、::::::::::::丶
/::::::::::::::/!i::/|/ ! ヾ リハ:|;!、:::::::l
/´7::::::::::〃|!/_,,、 ''"゛_^`''`‐ly:::ト
/|;ィ:::::N,、‐'゛_,,.\ ´''""'ヽ !;Kいいかげん殺すよ
! |ハト〈 ,r''"゛ , リイ)| この種の話題は聞き飽きてる
`y't ヽ' //
! ぃ、 、;:==ヲ 〃
`'' へ、 ` ‐ '゜ .イ
`i;、 / l
〉 ` ‐ ´ l`ヽ
/ ! レ' ヽ_
0754デフォルトの名無しさん
2005/07/03(日) 04:08:16それは問題が無いことが保証されているはずだ
定数ゼロをポインタに代入する場合は、常にヌルポインターとして扱われるし
ポインタとゼロが比較される場合には、ヌルポインターかどうかの比較になる
ヌルポインタの実値がゼロでない処理系であれば
if ((long)p)
とでも書けば、まあ違いが出るだろう
0755デフォルトの名無しさん
2005/07/03(日) 04:20:07シェルってのは、ユーザーの指示により実行ファイルを起動したりするプログラムのこと。
DOSプロンプトなんかはユーザーが入力したコマンドによって実行ファイルを起動するし、Windowsのエクスプローラは
実行ファイルがダブルクリックされることによってそれを起動する。
で、実行されたプログラムは、シェルに対して数値を返すことができる。
処理が正しく実行され、正常に終了した場合なんかは、0 を返すようにしておくのが一般的。
なんらかのエラーが発生したときには、適当な番号を割り振って、それを返すようにしたりする。
シェルは、複数のコマンドをまとめて実行させる仕組みを持っていたりして、MS-DOSのシェルならバッチコマンド、
UNIXのシェルならシェルスクリプトなんて呼ばれる仕組みがそれ。
複数のコマンドを実行する都合、どれか一つのコマンドがエラーで終了したときなどには、以降の処理をキャンセル
したりなど、処理の流れを変えたかったりする。
そういうニーズに対応するため、コマンドはシェルに対して終了コードを返し、シェルはその値によって処理の
流れを変えられる仕組みを持っている。
だから、あんまりそういう使い方を意識していないならば、とりあえず0でも返しておくのがいいと思う。
返せる値の範囲は処理系によるけど、0〜255くらいにしておけばあんまり問題は起きないと思う。
ちなみに、コマンドはシェルから起動される以外に、別の実行ファイルから実行されることもある。
その実行元のプログラムは、実行したファイルの終了コードを取得することができるよ。
あんまりシンプルに書けなかったけど、わかったかしら?
0756デフォルトの名無しさん
2005/07/03(日) 04:24:25なげーよ。
ちなみにUNIXシェルの場合、127を超える戻り値を使うのは薦められない。
まあ、0〜3程度の小さな整数を使うのが普通だな。
0757デフォルトの名無しさん
2005/07/03(日) 04:28:37goo job. カンポキだ ちくしょう
// 意外にも貴重なレスが貰えてしまった (・ω・´) ありがとございます
0758デフォルトの名無しさん
2005/07/03(日) 04:34:39便乗質問させてください。
もし NULL = 0x100 の処理系があったとします。
p = 0;
とやると、p に 0x100 が代入されるということでしょうか?
そして、p = 1 のときに p-- とやってしまうと、p はいくつになるのでしょうか?
関連して、p = 1 のときに
p2 = --p;
とやったときの、それぞれのポインタの値も気になります。
0759デフォルトの名無しさん
2005/07/03(日) 04:35:530760デフォルトの名無しさん
2005/07/03(日) 05:08:29> p = 0;
→ (long)p == 0x100
> p = 1 のときに p-- とやって
→ (long)p == 0x0 (pがchar*のとき)
> p = 1 のときにp2 = --p;とやったとき
→ (long)p == 0x0
(long)p2 == 0x0
じゃないかな、多分
0761デフォルトの名無しさん
2005/07/03(日) 05:08:450762758
2005/07/03(日) 05:38:44質問しておいてアレですが、それで正しいと思います。
>>761
すまん。faqを読めばしっかり書いてあったね。
ようするに、ポインタに絡む定数0は、コンパイラがヌルポインタに置き換えるんだね。
コンパイル後に結果的にポインタに値0が代入されたり比較されることになっても、コンパイル時にコンパイラがしたような
変換はされないということだ。
だから >>758 の p-- の結果は 0 になるし、0 になったときに 0x100 に置き換えるようなコードが挿入されるわけでも
ないわけだ。
あと、NULL の define が 0x100 になってると思ってたことが間違いだってことにも気付いた。
0763デフォルトの名無しさん
2005/07/03(日) 10:15:43exit(1);
は、エラー時に使うのに
return 1;
は通常終わりに返すんですか?
return 0;
はエラーなんですか?
0764デフォルトの名無しさん
2005/07/03(日) 10:20:21> は、エラー時に使うのに
そんなことは決っていない。
> return 1;
> は通常終わりに返すんですか?
そんなことは決っていない。
> return 0;
> はエラーなんですか?
エラーの場合もある。
0765デフォルトの名無しさん
2005/07/03(日) 10:24:130766デフォルトの名無しさん
2005/07/03(日) 11:39:58exit は、呼ばれるとプログラムを即座に終了するから、エラー時の処理の中断に都合が良くて使われるというだけの話。
たとえば main から関数を呼び、その関数も関数を呼び・・・ 関数の呼び出しの奥深いところで処理を中断したくなった場合、
exit を使わないでプログラムを終了するためには、奥深い関数から一つ一つ return していき、かつ処理が中断される旨
何らかの方法で main に伝えなくちゃいけない。
そういう面倒さを手っ取り早く解決するため、エラー時には exit を使ったりする。
個人的には main の return で必ず処理が終わるように構成するのが好きだから、exit は使わずに、エラーだろうと
なんだろうと main の return に到達するようにして、そこでエラーコードを返すようにしてる。
main での return 0 は、大抵はエラーではなくて正常終了のときの返却値。
0767デフォルトの名無しさん
2005/07/03(日) 11:43:44retun 1;
しないか?
俺だけ?
いままでずっと 1でしてきたけど
0768デフォルトの名無しさん
2005/07/03(日) 11:46:16普通は return 0; だと思う。
0769デフォルトの名無しさん
2005/07/03(日) 11:46:52成功に0, 失敗に1を返しておくと外部コマンドとして呼び出して
yourcommand && echo succ || echo fail
みたいな感じで成否で分岐できるようになるよ。
0770デフォルトの名無しさん
2005/07/03(日) 11:50:43結構ユーザいるけど誰からも、訂正きたことないけどな........
0771デフォルトの名無しさん
2005/07/03(日) 11:53:000772デフォルトの名無しさん
2005/07/03(日) 11:54:01他のコマンドと連携するものじゃないんでしょ?
だったら何返しても問題は出ないでしょう。
だけどコマンドラインプログラムなんかでは、正常時には 0 を返しておくのが懸命だと思う。
0773770
2005/07/03(日) 11:56:52他のコマンドとの連携はないかな
Xlib使ってなんかを表示関連がおおいから
全コード修正行ってきます....
0774デフォルトの名無しさん
2005/07/03(日) 11:59:01横着せずに、まじめに勉強しろよ。
0775770
2005/07/03(日) 12:52:07CFAQなんて読んだことないし、Cの勉強もしたことないのであしからず
OSのコードとか、自分が使ってるアプリのコード読んでCは大体覚えていったかな
まぁ、 return 1;は 初期に自分で書いたコードはなってなかったから
どっか勘違いしてたんだとおもうな
0776デフォルトの名無しさん
2005/07/03(日) 13:03:56C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
結構面白いから、だまされたと思って読んでみ。
>>1 に書いてあるリンクなんだけどな。
0777デフォルトの名無しさん
2005/07/03(日) 13:05:47リンク先のFAQもその一つに過ぎない。
その死後硬直した一面的な情報にしがみつくのはいかがな物かと。
0778デフォルトの名無しさん
2005/07/03(日) 13:40:320779デフォルトの名無しさん
2005/07/03(日) 13:40:490780デフォルトの名無しさん
2005/07/03(日) 13:57:210781デフォルトの名無しさん
2005/07/03(日) 14:11:480782デフォルトの名無しさん
2005/07/03(日) 14:16:170783デフォルトの名無しさん
2005/07/03(日) 14:16:34それをある一定数、配列で宣言し、それを定義した数だけ入力して、
結果をbinファイルに出力し、出力されたbinファイルから読み出して画面に出力する。
例えば、
struct 2ch
{
char name[100];
char ita[150];
} x[10];
を定義して、main関数内で、人数を2として、
1人目
x[0].name=nanashi;
x[0].ita=program;
2人目
x[1].name=mona;
x[1].ita=program;
を定義し、その情報を"2ch.bin"に出力し、
次に"2ch.bin"から情報を読み出して、
画面に出力する。
こういうコードを書きたいのですが、binファイルに出力するところまでは出来るのですが、
その先が分かりません。
解決法をよろしくお願いします。
0784デフォルトの名無しさん
2005/07/03(日) 14:26:26ようするに、構造体の配列の内容をファイルに出力することと、
ファイルの内容を構造体の配列に戻すことがやりたくて、
とりあえず出力まではなんとかできた
という話?
ファイルから構造体の配列に値を戻せれば、後の表示はできるんだよね?
ちなみに、ファイルにはどんな形で出力したの?
fwrite(x, sizeof(*x), n, fp);
みたいに出力したなら
fread(x, sizeof(*x), n, fp);
で戻せるし、その他の方法で出力したのであれば、読み込みもその形式に合わせる必要があるわな。
それとも、書き込み時と読み込み時に一度だけ fopen したファイルポインタを使いまわそうとしたけど
うまくいかないって話?
0785783
2005/07/03(日) 14:32:33出力するところまでは
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/651.txt
こんな感じに書きました。
よろしくお願いします。
0786デフォルトの名無しさん
2005/07/03(日) 14:37:58コード書き換える前に、ユーザに連絡するのが先だろ。
もし終了コード見ているプログラムがあったらどうするんだ?
0787デフォルトの名無しさん
2005/07/03(日) 14:42:44fp=fopen("2ch.bin", "r");
for(i=0;i<n;i++) {
char *p;
fgets(x[i].name, sizeof(x[i].name), fp);
if((p=strchr(x[i].name, '\n')) != NULL) *p='\0';
fgets(x[i].ita, sizeof(x[i].ita), fp);
if((p=strchr(x[i].ita, '\n')) != NULL) *p='\0';
}
fclose(fp);
これでどうだろう。
fgets は改行コードもバッファに入れるから、それを削除するコードを入れてみた。
fgets の EOF を監視して、ファイルの終わりを判断したりなどの改良の余地あり。
表示したいなら、この配列の内容を心行くまで表示すればいい。
0788デフォルトの名無しさん
2005/07/03(日) 14:46:11バグの重要度も考えずに大騒ぎするアホ降臨
0789デフォルトの名無しさん
2005/07/03(日) 14:49:54別にreturn 1やってもバグじゃないんだし、
大騒ぎして書き換えるほどのものじゃないと思う。
0790787
2005/07/03(日) 15:05:02fscanf(fp, "%[^\n]\n%[^\n]\n", x[i].name, x[i].ita);
とかやるのもいいかな?
バッファをあふれないようにするのが課題だけど。
fscanf(fp, "%100[^\n]\n%150[^\n]\n", x[i].name, x[i].ita);
とかすればいい?
つーか、バッファがあふれるようなケースだと、他に考慮しなくちゃいけないことがいろいろあって面倒だね。
0791デフォルトの名無しさん
2005/07/03(日) 15:10:420792783
2005/07/03(日) 15:48:02ありがとうございます。
790のやり方だと、うまく出来たっぽいのですが、
787のやり方だと、なんだかうまく出来てるか、出来ていないのか良くわかりません。
もともとのx[i]を表示しているように見えます。
試しに、x[]に戻すのではなくて、他にy[]を作って、そっちに読み込んで
出力したいのですが、どうすればよいでしょうか?
0793デフォルトの名無しさん
2005/07/03(日) 15:53:11785のコードではすべてのデータが1繋がりに出力されて、どこまでがnameだかitaだか区別できない。
0794デフォルトの名無しさん
2005/07/03(日) 17:11:30fputs()はなんか違うと感じるのは俺だけですか?
784のようにfwrite()じゃないの?
0795デフォルトの名無しさん
2005/07/03(日) 17:35:530796デフォルトの名無しさん
2005/07/03(日) 17:41:48fwrite/fread一発だろうな。それが一番簡単だし固定長レコードで
扱いやすい。
無論画面から読み取るのはscanfなりfgets/strtokなりを使う必要があるが。
0797デフォルトの名無しさん
2005/07/03(日) 18:16:280798デフォルトの名無しさん
2005/07/03(日) 18:21:10なぜ?
0799デフォルトの名無しさん
2005/07/03(日) 18:26:52・ポインタ・ハンドルは読み込んでも無意味。
注意事項はこんなものか。
0800デフォルトの名無しさん
2005/07/03(日) 18:28:03所詮CFAQレベルか
0801デフォルトの名無しさん
2005/07/03(日) 18:33:01思う。
ファイルをバイナリエディタで見れば、エンディアンや浮動小数点の
表現の問題はすぐに分かるだろうが、
コンパイラやハードウェア、OSを変えても互換性のあるファイル形式、
といった話になってくると、初心者レベルを超えたもっと高度な要求になる。
そういうことは、一度はやってみないと、なかなか理解できないものだ。
0802783
2005/07/03(日) 18:34:36fwrite,freadを用いた場合のコードを教えていただけませんか?
0803デフォルトの名無しさん
2005/07/03(日) 18:38:19賛成の方も反対の方も、このスレで自分は賛成か反対かをお書きください。
プログラム技術板に強制ID制を導入すべきか否か
http://etc4.2ch.net/test/read.cgi/vote/1118144381/
理由などの記入は別に構いません。
<<賛成>>か<<反対>>かだけ御記入頂ければ結構です。
ちなみに、当たり前ですが運営の方にIPが見えているので、1日ごとにIDが変わるからといって多重投稿しないでください。
0804デフォルトの名無しさん
2005/07/03(日) 18:39:070805デフォルトの名無しさん
2005/07/03(日) 18:41:21って、いくつになるの?
0806デフォルトの名無しさん
2005/07/03(日) 18:44:010807デフォルトの名無しさん
2005/07/03(日) 18:44:03aの元の値が判らないのに答えろと?
0808デフォルトの名無しさん
2005/07/03(日) 18:59:560809デフォルトの名無しさん
2005/07/03(日) 19:01:20自信を持って私が答えよう。
答は、「いくつになるか、予測不可能」だ。
0810デフォルトの名無しさん
2005/07/03(日) 19:31:25そろそろこういうのも演算順序規定して欲しいよな
いまどきこの程度で最適化がどうのこうのもねーだろ
0811デフォルトの名無しさん
2005/07/03(日) 19:36:45Cの初心者本終えたら、C++移っていいのかな?
0812デフォルトの名無しさん
2005/07/03(日) 19:37:580813デフォルトの名無しさん
2005/07/03(日) 19:47:17かくほう
for (i = 0; i < n; i++) {
fwrite(&x[i], sizeof(x[cnt]), 1, fp);
}
よむほう(nが分かってるなら)
for (i = 0; i < n; i++) {
fread(&x[i], sizeof(x[cnt]), 1, fp);
}
0814デフォルトの名無しさん
2005/07/03(日) 19:48:560815デフォルトの名無しさん
2005/07/03(日) 19:51:07ドイツの哲学者
0816デフォルトの名無しさん
2005/07/03(日) 19:51:530817デフォルトの名無しさん
2005/07/03(日) 22:01:57これは致命的な欠陥だと思います。
0818デフォルトの名無しさん
2005/07/03(日) 22:09:52/* やれやれだぜ */
fwrite(x, sizeof(*x), n, fp);
fread(x, sizeof(*x), n, fp);
0819デフォルトの名無しさん
2005/07/03(日) 23:17:07puts(" その数は奇数です。");
これは、if( no % 2 ) の後ろに;がないんですが、行が2つに分かれてもおkなんですか?
0820デフォルトの名無しさん
2005/07/03(日) 23:19:25ok
0821デフォルトの名無しさん
2005/07/03(日) 23:25:11Cの;は行末に配置する何者かではなく、構文上の「文」を終端するためのモンだ。
だから、文の終端以外には、別に行末でも;はおかんでもよい。
0822デフォルトの名無しさん
2005/07/03(日) 23:26:02fgets(buf,5,in);として4バイト読み込み、この4バイトを10進数の数値として表示させたいのですが、どうすればいいかわかりません。
教えてください。
0824デフォルトの名無しさん
2005/07/03(日) 23:57:280825デフォルトの名無しさん
NGNGfgets じゃなくて fread を使うといいと思う。
0826デフォルトの名無しさん
2005/07/04(月) 00:40:064バイトintをバイナリイメージのままファイルに書き込んであるのなら、fgets()は禁物。
int foo;
fread(& foo, sizeof(foo), 1, fp);
とでもすればいい。
但し、エンディアンに注意。
0827デフォルトの名無しさん
2005/07/04(月) 01:34:14わかったよ。
0828デフォルトの名無しさん
2005/07/04(月) 08:47:10ビットシフトはなんの役に立つのでしょうか?
0829デフォルトの名無しさん
2005/07/04(月) 11:30:25バイト単位ではなくビット単位のデータを扱うときに役にたちます。
たとえばデータ圧縮では、データの単位がバイトではなくビットであることが多々あります(しかも一連のストリーム上の
データのビット長が固定長に統一されているわけではなく、いろんな長さのデータ(1bit〜数十bitとか)が混在してたりします)。
ビットシフトは、ビット単位のデータを寄せ集めてバイト(あるいはワード)の形にまとめたり、あるいはその分解をするときに
大いに役に立ちます。
使い方がわからないうちは恐らく使う必要も無いので、今のところシフトについてそんなに気にする必要は無いでしょう。
0830デフォルトの名無しさん
2005/07/04(月) 12:09:24質問があります。
関数内のローカル変数として、
void func(void)
{
int num[5];
}
とあるのですが、
これを、
int ind=10;
void func(void)
{
int num[ind];
}
としたらコンパイルエラーになりました。
配列の要素数を変数で動的に変えることはC言語(C++でもかまいません)の規則上不可能なのでしょうか?
よろしくお願いします。
0831デフォルトの名無しさん
2005/07/04(月) 12:11:230832830
2005/07/04(月) 12:17:290833デフォルトの名無しさん
2005/07/04(月) 12:23:14http://www.google.co.jp/search?num=50&hl=ja&lr=lang_ja&q=%43%39%39
0834デフォルトの名無しさん
2005/07/04(月) 12:59:29どうするかを教えてやらないと
0835デフォルトの名無しさん
2005/07/04(月) 13:21:48ばか
0836デフォルトの名無しさん
2005/07/04(月) 13:23:03ソース上で、配列のサイズを変更したいだけなら
const int ind = 10;
void func(void)
{
int num[ind];
}
本当に動的に確保したいなら
int ind = 10;
void func(void)
{
int* num = (int*)malloc(sizeof(int) * ind);
free(num);
}
0837デフォルトの名無しさん
2005/07/04(月) 13:52:18typedef struct{
int a;
char b[20];
} HOGE;
void hoge( int argc, char **argc, HOGE *c){;}
void main(int argc, char **argv){
HOGE c;
hoge(argc, argv, &c)
}
というコードの意味がわかりません
hogeを呼ぶときに argcはint型なのでそのままいけることはわかるのですが
argvと、&cはなぜこのような表記になるのでしょうか?
argvは、**argc, cは、*cにはなぜならないのでしょうか?
すいませんが説明していただけるとありがたいです
0838デフォルトの名無しさん
2005/07/04(月) 13:55:39「ポインタについて何も知らないからぜんぶ説明してください」に見え
るぞ。入門書でも読みなさいな。
0839837
2005/07/04(月) 14:09:17cは単に勘違いしていました
mainで宣言したcのポインタをhogeのポインタ型変数のHOGE *cに、
渡すと言う意味ですね
すいません失礼しました
ですが、argvがどうしても理解できません
すいませんが説明していただけないでしょうか?
0840837
2005/07/04(月) 14:12:47私の推測というか見た感じのイメージでは
char **argcと宣言しているのでargcにはポインタのポインタが記憶されていて
argcとして渡すことで、hogeのchar **argcで、それをポインタのポインタとして解釈して受け取る
みたいなかんじなのでしょうか?
0841デフォルトの名無しさん
2005/07/04(月) 14:14:31その前に、hoge の第二引数は argc で合ってるの?それとも argv?
0842837
2005/07/04(月) 14:17:08argvです
失礼致しました
0843デフォルトの名無しさん
2005/07/04(月) 14:21:58int a; //int型のa変数
int *b; //int型の変数の先頭アドレス( bにはアドレスがはいっていて b = aでaの値が入るわけではなく
// *b = a で、アドレス先にaの変数がはいる
b = &a; //aの先頭アドレスを bにいれる
って感じでとらえたんだけど俺間違ってるの?
0844デフォルトの名無しさん
2005/07/04(月) 14:24:32物事はシンプルに考えよう。
argcもargvもmain()で受け取ったままhoge()に渡している。
すなわちhoge()ではmain()と同じようにargcやargvを使える。
以上。argc, argvについてそれ以外に余計なことを考える必要はない。
cについてはそのアドレスをhoge()に渡している。
すなわちhoge()ではmain()の内部で定義されたcをポインタを介してアクセスできる。
もし仮に、hoge()からさらにhage()にそのアドレスを渡したいのであれば、
void hage(HOGE * c){...;}
となり、
hoge()内部からhage(c);と呼ばれることになる。
0845デフォルトの名無しさん
2005/07/04(月) 14:32:31あってる
0846デフォルトの名無しさん
2005/07/04(月) 14:36:38この場合、bにはアドレスが入っていてそこに変数を入れることができるわけではなく
アンパサンドを使って他の変数のアドレスを入れることができる
これがわかったらポインタってわかると思うんだけど
わからないひとはなにがわからないのかね?
0847デフォルトの名無しさん
2005/07/04(月) 15:11:350848デフォルトの名無しさん
2005/07/04(月) 19:45:060849デフォルトの名無しさん
2005/07/04(月) 19:46:41特に無いよ
添え字が使える・使うべきときはp[]使うし
添え字が使えない・使わないべきときは*p使う
0850デフォルトの名無しさん
2005/07/04(月) 19:47:23まず質問が変
0851デフォルトの名無しさん
2005/07/04(月) 20:06:57嘘を教えるな
0852デフォルトの名無しさん
2005/07/04(月) 20:21:39演算子の優先度が違う。
p[x]は*(p+x)と等価だと、お釈迦様も言っておる。
それとも宣言とか引数の中での話?
0853デフォルトの名無しさん
2005/07/04(月) 20:22:030854デフォルトの名無しさん
2005/07/04(月) 20:32:31ビットフィールドはなんの役に立つのでしょうか?
0855デフォルトの名無しさん
2005/07/04(月) 20:34:300856デフォルトの名無しさん
2005/07/04(月) 21:04:12環境限定でデータをキツキツに詰め込む時に使う。
0857デフォルトの名無しさん
2005/07/04(月) 21:06:320858デフォルトの名無しさん
2005/07/04(月) 21:14:25理由が分かるかも。
0859デフォルトの名無しさん
2005/07/04(月) 21:16:56いいかげんくだらないコピペにレスするのやめてくれないかな
0860デフォルトの名無しさん
2005/07/04(月) 21:24:01いい加減だまっててくれないかな?
0861デフォルトの名無しさん
2005/07/04(月) 21:30:010862デフォルトの名無しさん
2005/07/04(月) 21:36:53Hello World!!
0863デフォルトの名無しさん
2005/07/04(月) 21:39:41{ }の範囲のことを何と呼ぶのでしょうか?
「区画」?
何か定義されてる名前があると思いますが。
0864デフォルトの名無しさん
NGNG0865デフォルトの名無しさん
2005/07/04(月) 21:41:230866デフォルトの名無しさん
2005/07/04(月) 21:41:31block
0867デフォルトの名無しさん
2005/07/04(月) 21:41:460868デフォルトの名無しさん
2005/07/04(月) 21:42:17中括弧と中括弧の間
0869デフォルトの名無しさん
2005/07/04(月) 21:42:360870デフォルトの名無しさん
2005/07/04(月) 21:43:30遠くから見た埴輪君
0871デフォルトの名無しさん
2005/07/04(月) 21:43:43手書きが難しい例の尖った括弧の間
0872デフォルトの名無しさん
2005/07/04(月) 21:45:35{本日は晴天なり|
~~~~~~~~~~~~~~~
どこでも簡単吹き出し君二号
0874<- = 865, 867, 869, 870, 872
2005/07/04(月) 21:47:23一人しか付いてきてくれなかった
0875デフォルトの名無しさん
2005/07/04(月) 23:12:37k=1の時の場合なら
if(k==1){
}
ですよね。k=1またはk=3の場合に真の処理をしたいのですが
0876デフォルトの名無しさん
2005/07/04(月) 23:14:03if (k == 1 || k == 3) {
}
ちなみに両方の条件を満たした場合というのは&&。
0877デフォルトの名無しさん
2005/07/04(月) 23:14:54ありがとうございます!
0878デフォルトの名無しさん
2005/07/04(月) 23:39:51float avg(int ,float ,float );
main()
{
float x,y;
int n;
printf("データを入力してください!");
n=1;
while(n){
printf("入力値%d= ",n);
scanf("%f",&x);
if(x == 0.0) break;
n++;
}
float avg(int n,float x,float y)
{
float b;
b = (x+y)/2;
return b;
}
このプログラム回らないんですけど、
どうしたら、回りますか??
教えてください。お願いします
0879デフォルトの名無しさん
2005/07/04(月) 23:43:54マルチかよ。
しっかりインデントつけろ、そうすりゃ分かる。
0880デフォルトの名無しさん
2005/07/04(月) 23:45:33そういう次元じゃないんだよね、これ。
0881デフォルトの名無しさん
2005/07/04(月) 23:47:54#include <stdio.h>
float avg(int n,float x,float y) {return (x + y) / 2;}
int main(void) {
float x, y; int dummy;
printf("データを入力してください!");
if (scanf("%f%f", &x, &y) != 2) return 1;
printf("%fと%fの平均:%f\n", x, y, avg(dummy, x, y));
return 0;
}
0882デフォルトの名無しさん
2005/07/04(月) 23:48:55じゃどういう次元?
インデント揃えて、足りないブレース一個でコンパイルは通るが?
0883デフォルトの名無しさん
2005/07/05(火) 00:01:370884デフォルトの名無しさん
2005/07/05(火) 00:12:310885デフォルトの名無しさん
2005/07/05(火) 00:12:53(・・?)ナゼ?、関数がうえにあるのでしょうか??
0886デフォルトの名無しさん
2005/07/05(火) 00:13:240887デフォルトの名無しさん
2005/07/05(火) 00:16:04(・・?)ナゼ?、>>881がこのスレにあるのでしょうか??
0888デフォルトの名無しさん
2005/07/05(火) 00:20:11おしえてクンの次元が違うということでFA?
0889デフォルトの名無しさん
2005/07/05(火) 02:35:130890デフォルトの名無しさん
2005/07/05(火) 03:41:350891デフォルトの名無しさん
NGNG別に変数の宣言は関数内部でなくても構わない。
int n;
void f()
{
n=1;
}
int main()
{
f();
printf("%d\n",n);
return 0;
}
0892890
2005/07/05(火) 03:52:03完全に、main関数じゃない関数で宣言した変数です
0893デフォルトの名無しさん
2005/07/05(火) 04:10:53main(){ int *p = intptr(); *p = 10;
0894デフォルトの名無しさん
2005/07/05(火) 04:15:33ない。
どうしてもやりたければ、変数の値をコピーすることで代用するしか無い。
0895890
2005/07/05(火) 04:26:410896デフォルトの名無しさん
NGNG具体的に何をしたいのか書かないと答えようがない。
void f(int *pa,int *pb)
{
int a,b;
a=ごにょごにょ
b=もにょもにょ
*pa=a;
*pb=b;
}
int main()
{
int a,b;
f(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
0897デフォルトの名無しさん
2005/07/05(火) 05:05:45コピーしなくても、ポインタを返すだけでもいいんでないの?
0898890
2005/07/05(火) 05:07:47やりたいことは、
Display構造体の変数をdisp関数で作って、
それを、どっからでも使えるようにしたい
グローバル変数はだめ
今までは、mainで宣言してdispに構造体を渡してたけど
dispで宣言しなわかりづらいからね
0899デフォルトの名無しさん
2005/07/05(火) 05:18:140900890
2005/07/05(火) 05:20:330901デフォルトの名無しさん
NGNGわかってないでそんなこと言ってるんだったらそれこそ負け組だが。
グローバル変数使ったってファイル分けりゃカプセル化可能。
Cでグローバル変数を使わずにできるアプローチは>>896か>>897。
それが嫌ならC++。
0902デフォルトの名無しさん
2005/07/05(火) 05:34:020903デフォルトの名無しさん
NGNG最近中身のない煽りが多くてイライラしてんだよ。とっとと消えろ。
0904デフォルトの名無しさん
2005/07/05(火) 05:54:28ファイル分けてカプセル化とか、アホかお前は
0905デフォルトの名無しさん
NGNG別ファイルなんてブラックボックスなんだから流れなんが見えなくていい。
インターフェースさえ明確ならそれでいい。
0906デフォルトの名無しさん
2005/07/05(火) 05:59:40まあ、その場合、通常はポインタをゲットする関数を作るわけだが。
> プログラムの流れが読みにくくなる
カプセル化の意味ねーーーー
普通は読みやすくするためにカプセル化するんだよ
初期化は、disp内で変数宣言するって言ってるんだから、
disp内でやればいいだろ
0907デフォルトの名無しさん
2005/07/05(火) 06:00:220908デフォルトの名無しさん
2005/07/05(火) 06:06:00main() { Display display; disp(&display); }
のかわりに
main() { Display *display; display = disp(); }
とすればいいだけの話か?
0909デフォルトの名無しさん
2005/07/05(火) 06:14:03main以外の関数からもポインタを取得できるようにするには、
disp関数をイニシャライザとして、
コレとは別にポインタ取得用の関数が欲しいと思うのは俺だけ?
0910デフォルトの名無しさん
2005/07/05(火) 09:13:250911デフォルトの名無しさん
2005/07/05(火) 10:54:19プログラム中に双方向リストのノード追加や削除と言った操作があるのですが、双方向リストが2つ以上存在する為、リストごとの追加や削除といった操作を置換マクロを使って一元管理したいのです。
削除や挿入操作は引数があれば出来たのですが、挿入操作は新しくリストを生成した後、そのリストのポインタを返却したいのです。
(関数であればreturn文で問題無かったのですが……)
どうか、置換マクロでの戻り値の方法を教えて下さい。
0912デフォルトの名無しさん
2005/07/05(火) 11:05:320913デフォルトの名無しさん
2005/07/05(火) 11:09:19代用案:そういうアホは無視すればいい
0914890
2005/07/05(火) 11:13:10まさか あほなの?
あほなんでしょ?
質問者の注文どうりの答えが出せないんなら
口ふさいでろよ
0915デフォルトの名無しさん
2005/07/05(火) 11:46:55関数でええやん、という気もするが。
挿入操作が式 foo、式 bar、その後値 newlist を返すとすると、
#define LIST_INSERT(oldlist,ent) foo, bar, newlist
とカンマ演算子を使うとか、
#define LIST_INSERT(oldlist,ent,dest) foo; bar; dest = newlist
と代入先もマクロ引数に含めてしまうとか。
0916デフォルトの名無しさん
2005/07/05(火) 12:15:38Display *disp()
{
static inited = 0;
static Display d;
if(!inited) {
初期化処理とか
inited = 1;
}
return &d;
}
これでどうか?
呼び出すだけでポインタが得られる。
これやるよりはファイル分け案の方が読みやすくなる気がするけど。
だけど、こういう方法だと、Display の実体をもう一つ欲しくなったときとかに修正が大変になるから、
全ての関数に Display* を渡すようにするのが汎用性が高くなると思う。
上記関数に引数を与えられるようにして、関数を賢くすればいいのかもしれないけど。
0917デフォルトの名無しさん
2005/07/05(火) 12:17:01>ダメなりゆうわかってないんだろうな とかそれ以前にダメっていってるのに
理由以前にダメなんですか。へー
>質問者の注文どうりの答えが出せないんなら
どうり?
>口ふさいでろよ
園児か。
0918デフォルトの名無しさん
2005/07/05(火) 12:23:11グローバル変数があるんだから素直に使っとけばいいじゃん。
コメントなりなんなりで、間違えないよう注意するようにしてさ。
と、思う俺は負け組み?
0919デフォルトの名無しさん
2005/07/05(火) 12:26:57Display *disp;
disp = XOpenDisplay(NULL);
だぞ、
Displayはポインタで宣言する
0920デフォルトの名無しさん
2005/07/05(火) 12:27:53適材適所でしょ。
グローバル変数にして有利になると思えばそうすればいいだけ。
errno なんかもグローバル変数なわけだし。
0921デフォルトの名無しさん
2005/07/05(火) 12:29:45みんなわかってなくてレスしてたのが面白かったのに
0922デフォルトの名無しさん
2005/07/05(火) 12:30:37ポインタだろうとなんだろうと >>916 の方法でイケるのではいか?
ようするにこうか?
Display *disp()
{
static Display *d = NULL;
if(d==NULL) {
d = XOpenDisplay(NULL);
その他処理
}
return NULL;
}
0923922
2005/07/05(火) 12:32:21× return NULL;
○ return d;
0924デフォルトの名無しさん
2005/07/05(火) 12:34:07もしかしてdispをグローバルにできない理由って、
Display *disp = XOpenDisplay(NULL);
int main()
{
・・・
}
って書いたらコンパイルが通らなかったからですか?
0925デフォルトの名無しさん
2005/07/05(火) 12:41:37一番の解決策は設計を見直す事だと思うよ。
0926デフォルトの名無しさん
2005/07/05(火) 12:42:52だから、そもそもできないって言ってるのに。
0927デフォルトの名無しさん
2005/07/05(火) 15:25:53'EXPORT/HOME/USER/DATA0706.TXT'
パス部とファイル名称部をうまく切り分ける方法を教えてつかあさい
0928デフォルトの名無しさん
2005/07/05(火) 15:35:29strrchr
0929うんちまん
2005/07/05(火) 16:32:02_makepath 環境依存だったりして(ぉ
0930デフォルトの名無しさん
2005/07/05(火) 17:14:290931デフォルトの名無しさん
2005/07/05(火) 17:16:41char *p;
char *tmp[20];
for(i=0;p=_mbschr(str,'/');i++)
{
tmp[i]=p;
}
思いつきカキコ(動作するのか?)
後ろからn番目の特定の文字cを探すことって
結構あるんだが、良い方法がわからん
0932デフォルトの名無しさん
2005/07/05(火) 17:18:140933927
2005/07/05(火) 17:38:43作動しはじめました。
0934デフォルトの名無しさん
2005/07/05(火) 19:49:55abc(int x,int y,int j,int k){
int i;
if(x<y){
for(j=x;j>0;j--){
if (x % j == 0){
k = j;
if(y % k == 0){
printf("CMN = %d\n",k);
j = 0;
}
}
}
}
if(x>y){
for(j=y;j>0;j--){
if (y % j == 0){
k = j;
if(x % k == 0){
printf("CMN = %d\n",k);
j = 0;
}
}
}
}
}
0935デフォルトの名無しさん
2005/07/05(火) 20:15:10typedef struct {
char cHage1 : 1;
char cHage2 : 1;
} HAGE;
の : ってどういう意味があるんですか?
あと
static Hage;
って変数の宣言見たんだけどこれってなに型?どういう意味なの?
よろしくおながいします。
0936デフォルトの名無しさん
2005/07/05(火) 20:16:34ビットフィールドでググレ。
> static Hage;
int 型
0937デフォルトの名無しさん
2005/07/05(火) 21:48:18int は省略しない方がイイ
C99ではアウトだから余裕があるなら直すべし
0938デフォルトの名無しさん
2005/07/05(火) 22:05:46int a[5][5]={
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25}};
int b[5][5]={
{3,6,9,12,15},
{18,21,24,27,30},
{33,36,39,42,45},
{48,51,54,57,60},
{63,66,69,72,75}};
//値はどうでもいい
int c[5][5];
int *p_a,*p_b,*p_c;
p_a = a;
p_b = b;
p_c = c;
intをいっぱい書いてるのにも特に意味はありません。
最後の三行の部分でエラーが出てしまいます。メッセージは
「error C2440: '=' : 'int [5][5]' から 'int *' に変換することはできません。(新しい動作 ; ヘルプを参照)
指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。」
です。わけわからんちんorz
宿題っぽい匂いはかもし出してますが、宿題じゃありません。
どこがおかしいのか指摘おながいします
0939デフォルトの名無しさん
2005/07/05(火) 22:06:590940939
2005/07/05(火) 22:10:30int *pa_a = a[0];
こうだな。
0941デフォルトの名無しさん
2005/07/05(火) 22:12:03int *p_a = *a;
0942デフォルトの名無しさん
2005/07/05(火) 22:13:370943デフォルトの名無しさん
2005/07/05(火) 22:31:45なるほど・・・多次元配列に関するポインタにはポインタ自体の配列を
なんちゃらしないといけないんですね。
ありがとうございますた!
0944デフォルトの名無しさん
2005/07/05(火) 22:34:59何か勘違いしてるだろ。
int (*p_a)[5];
は配列ではないぞ。
0945デフォルトの名無しさん
2005/07/05(火) 22:35:530946デフォルトの名無しさん
2005/07/05(火) 22:36:040947デフォルトの名無しさん
2005/07/05(火) 22:36:520948デフォルトの名無しさん
2005/07/05(火) 22:51:49と言ってみるテスト
0949デフォルトの名無しさん
2005/07/05(火) 22:57:03関数ポインタと配列が絡んでそれを返す関数ポインタへの配列とかな
要は一度きっちり理解して、後はtypedefでも使ってろってだけだが
0951デフォルトの名無しさん
2005/07/06(水) 00:33:30いわゆるハイ&ローを作りたいのですが、↑のソースだとバグだらけになってしまいます。
(当りなのに外れ等)
どこをどうすればいいのでしょうか?
0952デフォルトの名無しさん
2005/07/06(水) 00:37:060953デフォルトの名無しさん
2005/07/06(水) 00:59:05for(j=0; j<9; j++){ // 10回も回すな!
fflush(stdin); // 前回scanfのゴミが残ってるから掃除しとけ
scanf("%c",&bs);
0954デフォルトの名無しさん
2005/07/06(水) 01:04:26fflush(stdin); // 前回scanfのゴミが残ってるから掃除しとけ
0955デフォルトの名無しさん
2005/07/06(水) 01:12:35else printf("入力が違います\n次は?->"),j--; を最後に付け加える
0956デフォルトの名無しさん
2005/07/06(水) 01:13:23C99前提か?
0957デフォルトの名無しさん
2005/07/06(水) 01:16:010958デフォルトの名無しさん
2005/07/06(水) 01:19:37コメント程度の問題で
敢えてコンパイラ独自拡張に手を染めることも無かろ?
0959デフォルトの名無しさん
2005/07/06(水) 01:20:122人が交互に座標を指定していくというもの。
課題で出たけどワケワカラン('A`)
0960デフォルトの名無しさん
2005/07/06(水) 01:20:53宿題丸投げは専用スレで。
0961デフォルトの名無しさん
2005/07/06(水) 01:42:390962デフォルトの名無しさん
2005/07/06(水) 01:44:390963デフォルトの名無しさん
2005/07/06(水) 01:48:37>>962
0964デフォルトの名無しさん
2005/07/06(水) 01:49:52座標を指定する時点で○×じゃないだろ
0965デフォルトの名無しさん
2005/07/06(水) 01:50:35>>962
0966デフォルトの名無しさん
2005/07/06(水) 01:57:400967デフォルトの名無しさん
2005/07/06(水) 03:58:46仮想テーブルとか訳のわからんコメント入れたままだった・・・気にせずに頼む
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/671.cpp
スレ違いだけど許してくださi
小学生並み低脳のお節介なので、どうかスルーで もういなかったら悲しいけど
0968デフォルトの名無しさん
2005/07/06(水) 04:15:18ごめn 横ラインチェックのところ
if ( p[v*3] == p[h + v * 3] && p[h + v * 3] ) に直しといて。
これじゃ、2段目以降が判定されていない、迂闊。
あと定数散りばめてたり、e キー押した時は exit になってたり、めちゃくちゃだから
その辺の修正ぐらいしといてくだせぇ
0969デフォルトの名無しさん
2005/07/06(水) 05:46:31どうしても探索失敗になってしまいます。どう修正したらいいのでしょうか?
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/673.txt
(↑コンパイルは通るので実行できます)
0970969
2005/07/06(水) 05:48:52C言語なら俺に聞け! Part 110
http://pc8.2ch.net/test/read.cgi/tech/1120596481/
0971デフォルトの名無しさん
2005/07/06(水) 06:09:05まず簡単な検索の概要について説明してもいいんじゃない?
そこまでソース読んで汲み取れと?
0972デフォルトの名無しさん
2005/07/06(水) 06:38:52細かく見てないから、移動のルールとかはよく解らんが、
探索のアルゴリズムの大まかな流れはOKのような気がする。
がしかし、移動において変数frontが常に0のままなのだが・・・・
0973969
2005/07/06(水) 07:25:37そりゃそうですね・・・orz
概要ですが、
現在の状態から展開できるだけ全ての状態を展開して、
それに対して順列を使って番号付けして、現在の状態と対応させておいて、
目標状態になったら格納しておいた状態番号と状態に従って最初の状態までたどって
解を得るといった感じです。
0974デフォルトの名無しさん
2005/07/06(水) 09:24:090975デフォルトの名無しさん
2005/07/06(水) 09:29:04a = a * a * a;
return a;
0976デフォルトの名無しさん
2005/07/06(水) 09:33:10hoge = XOpenDisplay(NULL);
if( !hoge ){
perror(XOpenDisplay);
}
とはどういう意味でしょうか?
!hoge はどういういみなのでしょうか?
0977デフォルトの名無しさん
2005/07/06(水) 09:37:070978デフォルトの名無しさん
2005/07/06(水) 09:39:000979デフォルトの名無しさん
2005/07/06(水) 09:40:19抜けてました
int cube(int x) {/*・・・*/}
を作成せよでした
0980デフォルトの名無しさん
2005/07/06(水) 09:46:53if (a != b) {
というのがありますから、hoge ではないということ。
0か、そうでないかでtrue | false を判定。
例えば while(FindNextFile(省略)) は一見出られないが、
実際は確実に出られる。
hoge を-1,0,1,100 にして さあ、実験。
0981デフォルトの名無しさん
2005/07/06(水) 09:47:370982デフォルトの名無しさん
2005/07/06(水) 09:48:58絶対にエラー終了するんでないかい?
0983デフォルトの名無しさん
2005/07/06(水) 09:49:30976=978=980は、なんて名前の入門書を使っているんだい?
>>979宿題は(以下略
0984デフォルトの名無しさん
2005/07/06(水) 09:50:29アドレスが入ってるから絶対にperrorにながされるんじゃないの?
0985デフォルトの名無しさん
2005/07/06(水) 09:54:13は?
もしかして、
FILE *fp;
fp = fopen(...);
if (!fp) {
perror(...);
}
も、必ずエラーになると思ってる?
0986デフォルトの名無しさん
2005/07/06(水) 09:56:16!hogeは、hoge == 0 と等価だ。
0987984
2005/07/06(水) 09:58:17それは、fopenでエラーが出たらperrorに流されるんでしょ
あ、ifは正の数だったら流すんだっけ?
0989デフォルトの名無しさん
2005/07/06(水) 10:02:11上記で表示される結果(数値)を
char strLine[MAX_PATH];で定義したシンボルに格納したいのですが
どうすればよいでしょうか?
0990デフォルトの名無しさん
2005/07/06(水) 10:02:44おい
0991デフォルトの名無しさん
2005/07/06(水) 10:04:50数字を文字列に直して入れたいのか?
だったら少しは頭を使え。
0992デフォルトの名無しさん
2005/07/06(水) 10:11:56はいその通りっす。
char strSize[10];
wsprintf(strSize,"%d",FileSt.st_size );
strcpy( strLine,strSize);
でコンパイルは通るのですが、値がとれていないようです。
おながいします。
0993デフォルトの名無しさん
2005/07/06(水) 10:20:50頭悪い?
0994デフォルトの名無しさん
2005/07/06(水) 10:46:09お慈悲を〜
0995デフォルトの名無しさん
2005/07/06(水) 11:21:36> アドレスが入ってるから
アドレスが入っている、と言う時点で間違い。
0997989
2005/07/06(水) 12:57:320998デフォルトの名無しさん
2005/07/06(水) 13:03:130999デフォルトの名無しさん
2005/07/06(水) 13:05:011000デフォルトの名無しさん
2005/07/06(水) 13:05:2610011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。