C言語なら俺に聞け( ..
655:デフォルトの名無しさん
08/01/08 05:02:29
>>653
ほとんど使わないのかよ!
>>653
printfとかだとなんか字がでてくるだけでつまらなかったけど
scanfだとキーボード側から入力できて面白くなってきたぜ
しかし練習問題やったら、doubleなのに変換仕様を%fにしてたり
変数の前に&入れてなかったりとミス多発\(^o^)/
質問スレなのにすいません
656:デフォルトの名無しさん
08/01/08 05:50:55
>>655
scanfは正しい入力をしているならまだいいが、ひとたび間違った入力が来ると簡単にバグの原因になる。
整数(%d)を欲しいところで文字列なんて打っちゃった日にはもう・・・
まぁ外に出すようなものじゃなければ気にしなくてもいいけどね。
慣れてきたらそこらへんも勉強してみるといいと思うよ。
657:デフォルトの名無しさん
08/01/08 08:03:25
>>651
0 == feof(fp)
658:デフォルトの名無しさん
08/01/08 10:07:45
!feof(fp)
だろ。それじゃ4バイトも無駄になる。
659:デフォルトの名無しさん
08/01/08 10:15:14
とりあえず、入力と出力ができるようになってからいろいろ試せるんだし
scanfから入るのもいいんじゃない?そのうち使わなくなるだけで
660:デフォルトの名無しさん
08/01/08 13:18:16
>>658
どこでどんな4バイトが無駄になるんですか?
661:デフォルトの名無しさん
08/01/08 13:40:14
>>656
それは返り値でなんとかなるだろ
いやscanfで値取得がだめなのはもちろんなんだがな、オーバーフローは検知不可能できないし
そもそも>>658は誰宛なんだよwww
662:デフォルトの名無しさん
08/01/08 13:48:35
>>661
>オーバーフローは検知不可能できないし
検知できるんですか? できないんですか?
そもそも、その「オーバーフロー」とはなんのことですか?
663:デフォルトの名無しさん
08/01/08 13:49:56
知らない言葉が出てきたら自分で調べる癖つけないといつまでたっても上達せんよ
664:デフォルトの名無しさん
08/01/08 14:04:00
>>662
オーバーフローとは
風呂にお湯を張るとき、止めるのを忘れたときに起こる奴
665:デフォルトの名無しさん
08/01/08 14:07:58
エウレカ!エウレカ!
666:662
08/01/08 14:57:16
>>663
「オーバーフロー」の意味は判るのですが、整数値の入力でどんなオーバーフローが起きるのかと思いまして。
667:デフォルトの名無しさん
08/01/08 15:07:06
intの最大値は(4バイトの場合)2147483647でこれ以上大きい数値は格納できない。
longもunsignd intもcharもそれぞれに最大・最小値があるから、それを超える値を入力されると困る。
668:デフォルトの名無しさん
08/01/08 15:38:01
char *foo[] = {"C/C++", "は", "市ね"};
のような文字列の配列があった場合に、この配列の長さ(上の例では3)を
取得するにはどのようにすればできるでしょうか?
length のような関数があるのではないかと思うのですが、、、
669:デフォルトの名無しさん
08/01/08 15:39:06
sizeof(foo)/sizeof(*foo)
670:662
08/01/08 15:49:00
>>667
なるほど。で、それは検知不可能なんですね?
では検知できる入力関数はあるのでしょうか。
或いは、桁数制限してしまえばオーバフローは回避できますよね。
671:デフォルトの名無しさん
08/01/08 15:55:39
getsとかで数字を文字列として読み込んで、atoiとかで文字列を数字に変換する、とか。
文字列としてならいくらでも大きい数値を入れられるし、atoiはオーバーフローを検知してくれる。
672:デフォルトの名無しさん
08/01/08 16:12:32
>>669 ちょっとダサイけど、thx!
673:デフォルトの名無しさん
08/01/08 16:16:36
>>671
getsはない。
674:デフォルトの名無しさん
08/01/08 16:19:02
んだ。今度はバッファオーバーフローだな。
675:デフォルトの名無しさん
08/01/08 16:20:31
scanfでも桁数制限できるだろ
676:デフォルトの名無しさん
08/01/08 16:24:41
>>650
if(!num) はif(num == 0)と
if(num) はif(num != 0)と同じ意味
while(!feof(fp))はfeofの返り値が0になるまでって意味
677:デフォルトの名無しさん
08/01/08 16:32:53
ごめん
feofの返り値が0の間
678:デフォルトの名無しさん
08/01/08 16:38:00
>>671
果てしなく無意味なオーバーフロー対策だなwwwwwwwww
679:デフォルトの名無しさん
08/01/08 16:39:34
プロンプトで入力待ちするプログラムなんて練習のときくらいしか使わんからなんでもいいべ
リダイレクト前提のやつはこの限りでもないが。
680:デフォルトの名無しさん
08/01/08 16:56:16
for(i=0; i < 10; i++){
printf("%d %d\n",x++,x);
}
だと表示される値は2つとも一緒なのに
printf("%d %d\n",x,x++);
に変えるとなぜ左側のほうが大きくなるのでしょうか?
後ろに++を付けているのだから右側が大きくなるべきだと思うのですが
681:デフォルトの名無しさん
08/01/08 16:57:05
なんだべきって
682:デフォルトの名無しさん
08/01/08 16:58:08
>>680
それ未定義動作
まあ理由としては、引数は後ろからスタックに積むから後ろの式を先に評価するケースが多いからだろうな。
683:デフォルトの名無しさん
08/01/08 17:03:12
>>681
「べき」って使いませんか?
「大きくならなければならないと思うのですが」というニュアンスです。
>>682
素早い回答有り難うございます。
684:デフォルトの名無しさん
08/01/08 17:10:17
681は日本語を勉強するべきだろう。
685:デフォルトの名無しさん
08/01/08 17:49:24
SEになりたくて、IT企業に就職しても、
途中で挫折する人がいて退職する人も多々いると聞きます。
そう言われてる箇所は、だいたいどういう箇所なのか
具体的に教えてくれませんか?
686:デフォルトの名無しさん
08/01/08 17:50:06
人間関係
687:デフォルトの名無しさん
08/01/08 18:03:14
マ板で聞け
URLリンク(pc11.2ch.net)
688:デフォルトの名無しさん
08/01/08 20:04:43
UNIX Cシェルのmakefileで、
外部の環境変数が設定してあるファイルを
makefileの中から読み込むことって出来ますか?
出来るなら方法を教えてください。
689:デフォルトの名無しさん
08/01/08 20:17:37
さすがにそれはシェルスクリプトのスレかmakeのスレで聞いた方がよくね
690:デフォルトの名無しさん
08/01/08 20:29:21
>>689
ありがとうです
makeスレがないですね
シェルはあまり関係なさそうだし・・
うーん。どこがいいんだろ・・
691:688
08/01/08 20:38:44
それっぽいスレ見つけました
そちらで聞いてみます。どうもありがとうでした。
692:デフォルトの名無しさん
08/01/08 21:03:00
fopenの書き込みモードで第1引数(?)にC:\save.txtのように入れたのですが、指定したフォルダを探してもファイルがありませんでした。
エラーは出なかったのでおかしいと思って、読み込みモードで同じフォルダを指定すると読み込むことができました。
あれ?と思いそのフォルダを開いてみたのですが、ファイルは見当たりませんでした。
これはどういうことなんでしょうか?
693:デフォルトの名無しさん
08/01/08 21:04:03
>>692
C:\\save.txt
694:デフォルトの名無しさん
08/01/08 21:05:43
え?ファイルが無いのに読み込めたの?
695:デフォルトの名無しさん
08/01/08 21:08:09
>>693
ありがとうございます!
ファイルを保存できました。
>>694
そうなんです
これはなぜだったんでしょうか?
696:デフォルトの名無しさん
08/01/08 21:35:54
>>695
書き込みモードで起動したときにファイルを作成したと思う。
697:デフォルトの名無しさん
08/01/08 21:51:47
>>692
別のフォルダでsave.txtというファイルをまず作ってくれ
それをお前さんが指定したフォルダにコピーできるか試してみてくれ
あと使っているOS教えてくれ
見えないというのはGUIを使っているということでいいのか?
698:デフォルトの名無しさん
08/01/08 22:13:51
>>697
コピーできました。
OSはWindowsXPです。
GUIです。
D:\save.txtで書き込むとちゃんとファイルが出来ました。
指定したフォルダはCの中にあり、その奥に既にsave.txtがあったのが問題だったのでしょうか?
勝手に探してくれたということだと思うのですが。
699:デフォルトの名無しさん
08/01/08 22:25:38 BE:314515679-2BP(294)
上のほうでfeof()で終了判定してるやつがいるけど、どこの素人だよ。
fscanf()がEOFを返したときに終了するのが普通。
700:デフォルトの名無しさん
08/01/08 23:08:51
>>698
何も解決にならないでこんなこというのもなんだが
画面に絵とかファイル名とかが表示されてないだけで実際はファイルが生成される現象かな
Windows使ってる友人から以前聞いたことある
ブラウザからテキストの内容を見ることできると言っていたかな
力になれなくてすまん
701:デフォルトの名無しさん
08/01/08 23:16:15
>>699
なら>>645のためにも
>>648よりスマートに書いてみろよw
702:デフォルトの名無しさん
08/01/08 23:36:51 BE:29954423-2BP(294)
feof()の仕様って欠陥だろ。
なんでこんな使いどころのない関数があるんだよって感じ。
703:デフォルトの名無しさん
08/01/08 23:39:32
エラー時に、ファイル終端に到達したのか
エラーが発生したのかチェックするために使うんじゃね。
704:デフォルトの名無しさん
08/01/09 00:05:44
バイナリファイルはfeofで、特に他では使うなとか聞いたな
705:デフォルトの名無しさん
08/01/09 00:07:24
>>704
それを言ってた奴は馬鹿。
706:デフォルトの名無しさん
08/01/09 00:10:05
読み込みエラーが発生して、ずっとエラーから復帰できなかったら、
永遠にファイル終端に達しないから、エラーチェックしないと feof は危険。
しかし、そのエラーチェックでファイル終端も分かるから・・・。
707:デフォルトの名無しさん
08/01/09 10:00:41
feofが単独で存在するのは読まずにチェックすることがあるからで、
読んでるのなら使うことはないな。
708:デフォルトの名無しさん
08/01/09 16:03:33
まあ、読まないとEOFフラグセットされないわけだが
709:デフォルトの名無しさん
08/01/09 22:44:54
0バイトのファイルを開いた直後の状態でもEOFではないでしょうか?
710:デフォルトの名無しさん
08/01/09 22:46:43
ではない
711:デフォルトの名無しさん
08/01/10 00:44:18
別に読むのがライブラリで自分が読まないケースだってあるんだよ
712:デフォルトの名無しさん
08/01/10 02:27:56
>645 は1行あたりのデータ数がまちまちなんだが、そもそも
>2次元配列にいれる
っていうルールはどんなんだ?
713:デフォルトの名無しさん
08/01/10 02:41:23
連投嫌われる?
聞きたい事いいいいっぱいあるです・・・。
714:デフォルトの名無しさん
08/01/10 02:49:36
重要度の高い順に少しずつ質問すればいいと思うよ。
715:713
08/01/10 02:57:50
じゃぁひとつだけ><
ソケット通信用のIOを得たときや、
open などのシステムコールを使って
ファイルディスクリプタを得た時など、
これらのリソースが正数型で返されますが、
この返り値は単なる確保したIOリソース用の
管理用番号みたいなモノと考えて良いのでしょうか?
また、もしそうならば、同一の正数値を指定さえすれば、
同じリソースに対して操作が可能なのでしょうか?
716:デフォルトの名無しさん
08/01/10 03:02:50
>>715
open()の度に更新されるから、無理。勿論、close()しない限りは変わらないが。
# 例外は、stdin, stdout, stderr, stdaux相当のディスクリプタ。
717:デフォルトの名無しさん
08/01/10 03:17:54
>>716さん
レスありがとうございます!
>open()の度に更新されるから、無理。
これに関してはもちろんわかっています。
ただ、返り値自体がどの範囲でどういった形で、
有効なのかが解らなかったもので…。
(IOを得るのにポインタとかで操作しないのかなー?と思ったのです。)
同じプロセス上から同じ値で参照した場合。
という意味で書きました。解りにくくてすみません…。
でも
>勿論、close()しない限りは変わらないが。
ということは715は合ってると考えていいですよね?
># 例外は、stdin, stdout, stderr, stdaux相当のディスクリプタ。
参考になります!
718:デフォルトの名無しさん
08/01/10 03:19:37
訂正です。
誤:ということは715は合ってると考えていいですよね?
正:ということはclose()しない限りは715は合ってると考えていいですよね?
結果的に連投になってしまいましたすみません><
719:デフォルトの名無しさん
08/01/10 03:30:02
>>718
同じプロセス上でopenしたままの記述子なら同じ。
というかそうじゃないと全てのIOが出来ない。
720:デフォルトの名無しさん
08/01/10 04:17:52
char array[256];
と宣言したら
sizeof(array);
で256が返ると思います。でも、
void print_arraysize(char *array) {
printf("%d",sizeof(array));
}
というようにするとポインタのサイズが返ります。
呼び出される関数側から配列のサイズを知る方法はありますか?
721:デフォルトの名無しさん
08/01/10 04:22:46
>>720
Cでは無理です。諦めて、その関数にサイズも渡すしかありません。
722:デフォルトの名無しさん
08/01/10 12:21:11
>>720
構造体の中に配列入れて構造体を引数にすれば、関数に配列を渡せる。
ただ、関数を呼ぶときに構造体の中身の全コピーが作られるので、激しく無駄。
配列の要素数を1つ多めに作っておいて、そこに目印となる値を入れておいて、
関数側で数えるという手もある。
けど結局はfunction( array , sizeof(array) )のようにして呼び出す
関数を作るのが一番かと。
723:デフォルトの名無しさん
08/01/10 13:52:06
自然数n = 10, r = 0, 1, . . . , 10 に対してnCr を出力するプログラムを教えてください。もしくはそれが載ってるサイトを教えてくださいm(__)m
724:デフォルトの名無しさん
08/01/10 13:55:15
>>723
C/C++の宿題を片付けます 102代目
スレリンク(tech板)
725:デフォルトの名無しさん
08/01/10 20:23:44
くだらない質問なのですが
Cで
static int hoge;
int static hoge;
の違いって、前者が大域変数になって
後者が関数内で静的な、値を保持しつづける関数になるってことですか?
726:デフォルトの名無しさん
08/01/10 20:26:52
違う。
staticのような修飾子と型名は順不同というだけ。
727:デフォルトの名無しさん
08/01/10 20:28:17
>static int hoge;
>int static hoge;
その2つは一緒
>前者が大域変数になって
>後者が関数内で静的な
それは宣言する場所で変わる
関数の外で宣言すれば大域
関数の中で宣言すれば関数内のみ
728:デフォルトの名無しさん
08/01/10 20:39:05
関数内でも大域にならない?
729:デフォルトの名無しさん
08/01/10 20:44:34
寿命はそうだがスコープは地が宇部
730:デフォルトの名無しさん
08/01/10 20:49:33
なんで意味合いの違うものに両方staticなんて割り当てたんだろうな。
ファイルローカルはexternに対してinternalとかにすりゃよかったのに。
731:デフォルトの名無しさん
08/01/10 20:56:39
C++では無名名前空間で対処したな。
732:デフォルトの名無しさん
08/01/10 21:05:53
>>725ですが
ちょいとまだ把握できてないです
void main(){
int hoge[400000];だとアウトで
static int hoge[400000]; だと領域が確保できて
…
}
教えてくれた人が「static使うと、たくさん取れるよ」と言ってくれたので調べたのですが
どうもそういうことが見当たらなくて「静的な」とか。
上のような使い方は間違ってますか
733:デフォルトの名無しさん
08/01/10 21:11:25
それは、static つけないとスタック領域を使うし、
スタック領域は他と比べるとかなり小さいから。
まあ恒久的なプログラムじゃなくて、一時的な使い捨てプログラムのときはそうやることもある。
734:デフォルトの名無しさん
08/01/10 21:32:40
つまり、staticつけると
大域変数と同じところのメモリ領域を使うということですか。
735:デフォルトの名無しさん
08/01/10 22:02:25
そゆこと
736:デフォルトの名無しさん
08/01/10 22:08:02
了解しました!
737:デフォルトの名無しさん
08/01/11 02:32:24
>>733
メモリ制限厳しい組込みとかだと普通にやるよ。
まぁでもソコまでだと、外部変数のバッファを使いまわしてチューニングする方が多いかも。
そんなんやりたく無いんだけどね・・・ハードコスト削減には勝てんわ。
738:デフォルトの名無しさん
08/01/12 13:09:17
音声出力のソースを作っています。
以下のソースで、ファイルは出力されるのですが、音声が出てきません。
どこを修正すればよいか教えていただけませんか?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define SIZE 22050*5
#define OFFSET 23
int main(int argc,char *argv[])
{
FILE *fp;
short int inbuf[SIZE];
short int outbuf[SIZE];
int i,f,f0,amp,PI;
f = 440;
f0 = 11050;
amp = 5000;
if((fp = fopen("test-sound-16-22.wav", "rb")) == NULL ) {
printf("ファイルオープンエラー\n");
exit(EXIT_FAILURE);
}
739:デフォルトの名無しさん
08/01/12 13:10:09
続き
fread(inbuf, sizeof(short int), SIZE, fp);
fclose(fp);
for (i=OFFSET; i<200; i++)
printf("%d, ",inbuf[i]);
printf("\n");
for (i=0; i<OFFSET; i++)
outbuf[i]=inbuf[i];
for (i=0; i<(SIZE-OFFSET); i++){
outbuf[i+OFFSET] = amp * sin(2*PI*i*(f/f0));
}
for (i=(SIZE-OFFSET); i<SIZE; i++)
outbuf[i]=0;
if((fp = fopen("testfile2.wav", "wb")) == NULL ) {
printf("ファイルオープンエラー\n");
exit(EXIT_FAILURE);
}
fwrite(outbuf, sizeof(short int), SIZE, fp);
fclose(fp);
return 0;
}
740:デフォルトの名無しさん
08/01/12 13:15:12
>>738
音声を出力するところがどこにもないじゃん。
741:デフォルトの名無しさん
08/01/12 13:15:13
出力された音声はどんなふうになってる?
あとsin()の中intになってないか?
742:デフォルトの名無しさん
08/01/12 13:15:43
音声→音声ファイルね
743:デフォルトの名無しさん
08/01/12 13:25:55
>>738
PIの初期化してないじゃん。ちゃんとデバッグしてんの?
744:デフォルトの名無しさん
08/01/12 13:29:16
そーだ、それも書くの忘れてたw
745:738
08/01/12 13:29:36
これとほぼ同様のソースで、2倍の周波数(以下のソース)で出力するものは、
きちんと出力されて、音声も出ています。
正弦波の合成はなぜか出来ない・・・
>> 740
音声ファイルを出力するところがないとは?音声ファイルは出力されていますが・・・
>> 741
出力された音声ファイルは何も発音がありません。
ファイルのサイズはきちんとあるので、データは自体は出力されていると思うのですが・・・
for (i=0; i<(SIZE-OFFSET)/2; i++) {
outbuf[i+OFFSET]=inbuf[i*2+OFFSET];
}
for (i=(SIZE-OFFSET)/2; i<SIZE; i++)
outbuf[i]=0;
746:デフォルトの名無しさん
08/01/12 13:29:48
math.hにPIが定義してあるのかとおもったが、そうでもないな
747:デフォルトの名無しさん
08/01/12 13:30:48
とりあえずPIの定義と、sin()の2を2.0にしてみ
748:デフォルトの名無しさん
08/01/12 13:38:51
何も言わずにコピペだとマルチうぜーとか言われそうなもんだけど、ここの住人は優しいんだな
749:デフォルトの名無しさん
08/01/12 13:53:05
>>745
デバッガで変数の値見ながら実行すればすぐに分かりそうなもんだけど。
750:738
08/01/12 14:09:29
解決できました。皆さんありがとうございます。
751:デフォルトの名無しさん
08/01/13 06:12:14
構造体で
氏名
年齢
住所
が入る変数を宣言しその構造体の配列を10人分用意しループで順番に入力してもらい氏名、住所、年齢に
空ENTERが入るとループを終了するということをしたいのですが。
全ての項目に空ENTERが入力されるとループを終了するという所をどのように書けばいいのかわかりません。
教えて下さい。
752:デフォルトの名無しさん
08/01/13 06:37:02
>>751
空ENTERが入力されたかどうか判別するプログラムは作れるのか?
753:デフォルトの名無しさん
08/01/13 10:41:06
>>751
氏名をfgets関数で入力し、strlen関数で氏名の文字数を求め、それがゼロだったら終了
754:デフォルトの名無しさん
08/01/13 12:34:26
fgetsってファイル関連の関数じゃないの?
文字入力として使えるの?
755:デフォルトの名無しさん
08/01/13 12:37:19
えー
756:デフォルトの名無しさん
08/01/13 12:43:11
>>754
っ stdin
757:デフォルトの名無しさん
08/01/13 13:34:55
printf()とかputs()とかscanf()とか全部廃止して、f****()に統一すりゃいいのに。
ストリームの概念が理解しやすくなる。
758:デフォルトの名無しさん
08/01/13 13:48:56
f***()とか全部廃止してopen/close/read/writeにすれば良いのに。
ディスクリプタの概念が理解しやすくなる。
759:デフォルトの名無しさん
08/01/13 13:54:48
もう開く/閉じる/書く/読むでいいよ。
760:デフォルトの名無しさん
08/01/13 13:56:07
それなんてinterface?
761:デフォルトの名無しさん
08/01/13 14:14:31
LISP だと以下のようにして定義できるが
(defun 開く (file-name mode &optional perm) ...)
(defun 閉じる (file-desc) ...)
(defun 書く (file-desc buff buff-size) ...)
(defun 読む (file-desc buff buff-size) ...)
まぁ, スレ違いだわな
762:デフォルトの名無しさん
08/01/13 17:50:32
スレ違いに値しますが、どなたかtabキー送り幅の設定方法を教えて下さい
8マスから4マスに変えたいです
763:デフォルトの名無しさん
08/01/13 17:51:57
>>762
環境による。また、アプリケーションの設定にもよる。
764:デフォルトの名無しさん
08/01/13 17:52:18
スレ違いすぎるwww
エディタによる、いやそもそもエディタの話なのかも知らんが
765:デフォルトの名無しさん
08/01/13 17:52:22
それは表示する側の問題だろ。Cの範疇じゃ無理。
使ってるOSと端末くらい書け。
766:デフォルトの名無しさん
08/01/14 00:21:01
教えてください
int main(void)
{
char *c1;
{
char *c2;
c1 = StoA(1000);
c2 = StoA(2000);
printf("c1 : %d\n", c1);
printf("c2 : %d\n", c2);
}
return 0;
}
このプログラムを実行すると、 なぜかc1の値がc2の値と同じになってしまします。
なぜなのか教えてください。
767:デフォルトの名無しさん
08/01/14 00:22:24
***追記***
ちなみにStoA関数は数値を文字列に変換する関数です。
768:デフォルトの名無しさん
08/01/14 00:22:35
StoAって何だよ
769:デフォルトの名無しさん
08/01/14 00:23:33
StoAの中身書いてないわろた
770:デフォルトの名無しさん
08/01/14 00:24:04
どうみてもStoAが悪いだろw
771:デフォルトの名無しさん
08/01/14 00:35:00
どうみてもStoAが悪い。
あと
>printf("c1 : %d\n", c1);
>printf("c2 : %d\n", c2);
%sちゃうのか?
で、同じ数値になるってところからサイコメトリーすると、
グローバル変数かローカル変数辺りの配列のポインタを返してると見た。
コール時にバッファ渡すか、StoAでmallocしてmainでfreeするかしたまい。
StoAを作るのが目的でないならsprintfかitoaでも使え。(個人的にはsprintf)
最後に、C言語で数値を文字列に変換する関数は「ItoA」か「ItoS」な。
StoAだと何してんだか訳分からん。
772:デフォルトの名無しさん
08/01/14 00:42:07
すんません%sでした"汗
StoAはshort型からアスキーコードに変換する関数です。
int main(void)
{
char *c;
c = StoA(123);
printf("%s\n", c);
return 0;
}
だと正常に動きます。
773:デフォルトの名無しさん
08/01/14 00:44:08
mainの中にあたらしいブロックを作ってその中で*c1をつかうのがなんかしらダメなんじゃないかなと思うんですが。
作るのが目的ではなくてなぜこうなるのか説明するのが目的なのでよろしくおねがいします。
774:デフォルトの名無しさん
08/01/14 00:45:06
いいからStoAの内容書けよ
775:デフォルトの名無しさん
08/01/14 00:46:24
>>772
んなこた良いからさっさとStoAのソースを貼れwww
776:デフォルトの名無しさん
08/01/14 00:48:09
StoAのソースコードは守秘義務の関係上公の場に貼ることは出来ません。
無茶な要求をしないでください。もう少し常識をわきまえて。
777:デフォルトの名無しさん
08/01/14 00:48:59
じゃあ分かりません帰ってください
778:デフォルトの名無しさん
08/01/14 00:49:16
説明するのが目的なのか、説明してもらうのが目的なのかはっきりして欲しいな
779:デフォルトの名無しさん
08/01/14 00:51:35
>>776
その通りです。
ありがとうございます。
>>778
説明するのが目的なので分かりやすく説明してもらえると光栄です。
780:デフォルトの名無しさん
08/01/14 00:55:23
とりあえず、StoAのソースを貼る気がないのなら終了で。
781:デフォルトの名無しさん
08/01/14 00:56:15
>>779
c1 = StoA(1000);
c2 = StoA(2000);
printf("c1 : %s\n", c1);
printf("c2 : %s\n", c2);
↑で同じ値が出るんだろ?多分両方2000か?
c1 = StoA(1000);
printf("c1 : %s\n", c1);
c2 = StoA(2000);
printf("c2 : %s\n", c2);
これで同じになるか試してみ。
違う値になるようなら、多分StoAがstatic変数かグローバル変数のバッファ使ってる。
printf("%p, %p\n", c1, c2);
で同じ値が出てくるはず。
そうじゃなきゃ、自分でデバッグしてくれ。
ソース無しじゃお手上げ。
782:デフォルトの名無しさん
08/01/14 01:14:31
正直いいますと今手元にソースが無いのでかけませんが、覚えてる範囲で流れを書きます。
処理@
引数の桁数を調べる
(引数が12345ならiDigに10000を入れておく)
処理A
pStrにcStrのアドレスを入れて
数値を文字コードに変換して*pStrに格納。
処理B結果をかえす。
ちなみにcStrはstatic変数です。
わかりにくくてすいません"汗
783:デフォルトの名無しさん
08/01/14 01:16:48
StoAがわかったら説明してやんよ
784:デフォルトの名無しさん
08/01/14 01:18:02
そら二回目の呼び出しで cStr の内容を上書きしてるから
同じのが表示されるの当たり前でんがな。
バッファをローカルで持って、引数で渡すといいよ。
785:デフォルトの名無しさん
08/01/14 01:36:21
ある時間,たとえば10時20分50秒になったらAの動作を行うというプログラムはどう作れば良いですか
ひとつの方法としてtimeを使って,現在の時間を取得し続け時間になれば動作する方法
これだとずっと時間を取得し続けるので,良くないような気がするので・・・
ちなみに環境はFedora,gccです.
786:デフォルトの名無しさん
08/01/14 01:39:22
cron に投げれば
787:デフォルトの名無しさん
08/01/14 01:43:59
sleep(指定時間-現在の時刻)
すりゃいいだろ。
ま、ふつーにcron使えと。
788:デフォルトの名無しさん
08/01/14 01:47:34
本人の振りしてあおるのもうやめろよwwwみんな耐性ついてるんだしwwwww
789:デフォルトの名無しさん
08/01/14 01:48:44
>>786
ありがとうございます.ちょっと調べましたがcronは使えそうです.
あとは,外部から動作する時間の変更が行われるので,それが出来るか調べて見ます.
自分のプログラムだけで実現できると一番良いですが・・・
790:デフォルトの名無しさん
08/01/14 01:51:44
sleepの方法も考えましたが,時間の変更を行うことがあるので実現しにくいと思いやめました
やはりcronを使わないとしたらこの2つですかね
791:デフォルトの名無しさん
08/01/14 02:02:11
コンソールアプリケーションの画面を何も表示されていない真っ黒の画面に
戻したいんですが方法を教えてください。
792:785
08/01/14 02:04:17
cron調べましたが使えそうです
ありがとうございました
793:デフォルトの名無しさん
08/01/14 02:04:31
OSに依存する
794:デフォルトの名無しさん
08/01/14 02:36:42
>>791
winだったら、system("CLS");
795:デフォルトの名無しさん
08/01/14 02:38:30
>>791
win以外ではエスケープシーケンスとか
796:デフォルトの名無しさん
08/01/14 04:25:03
clearコマンドが使える場合もあるけど、鼬害。
797:デフォルトの名無しさん
08/01/14 10:50:14
sysytem("cls")だとちらつきがひどいんですが
ちらつかないようにって可能なんでしょうか。
もし可能であるならばどうやればいいのでしょうか。
798:デフォルトの名無しさん
08/01/14 10:53:06
ちらつきって
コンソールでゲームでもつくってんのか?
799:デフォルトの名無しさん
08/01/14 10:55:58
エスケープシーケンスなりCursesなりコンソールAPIなり好きなの使っとけ
細かい制御が必要なら環境かけっつうの
800:デフォルトの名無しさん
08/01/14 10:56:23
毎回書き換えが必要な所のみ書き換えるか
全画面を一度に書き換えるか。
どちらにしろ標準関数だけじゃ辛いので、
こういった関数を使うしかない。
URLリンク(msdn.microsoft.com)
801:デフォルトの名無しさん
08/01/14 11:26:59
ちょっとしたゲームをつくっています。
環境はWinです。
同じ文字列が右から左に移動していき左端にきた文字は消えていくというのをしてるのですが
おもったようにちらつきを消すことができまちぇん。。
802:デフォルトの名無しさん
08/01/14 11:40:12
>>801
消さずに上書き。
変化の無い部分は書き換えない。
803:デフォルトの名無しさん
08/01/14 11:48:49
う、うわがき・・・
上書きってどう書けばいいのかわかりません。。。。
ちょっとした例示してもらえませんか?
804:デフォルトの名無しさん
08/01/14 11:49:56
消したい文字列と同じ座標にスペースか何かで上書きするとか
805:デフォルトの名無しさん
08/01/14 11:58:06
// >>801
#include <stdio.h>
#include <string.h>
void func(int width, const char * str)
{
int len = strlen(str);
for (int ic = 0; ic <= len; ++ic) {
printf("\r%*.*s", width, ic, str);
fflush(stdout);
sleep(1);
}
for (int ic = 0; ic < width; ++ic) {
printf("\r%*s%*s", width - 1 - ic,
ic < width - len ? str : str + ic + 1 - width + len,
ic + 1, "");
fflush(stdout);
sleep(1);
}
}
int main()
{
func(20, "abcde");
return 0;
}
806:デフォルトの名無しさん
08/01/14 12:41:05
int main(int argc, char **argv){
FILE *fp;
int i, j, a, b;
short int image[HEIFGT][WIDTH];
上のプログラムを一行ずつ何をしてるんですか?
a = atoi(*argv[1]);
b = atoi(*argv[2]);
807:806
08/01/14 12:42:21
あと下の
a = atoi(*argv[1]);
b = atoi(*argv[2]);
も教えてください
808:デフォルトの名無しさん
08/01/14 12:49:27
Windowsでもcurses使えるんだっけか?
809:デフォルトの名無しさん
08/01/14 12:54:39
>>808
移植はされてると思う。
810:デフォルトの名無しさん
08/01/14 12:56:27
>>807
プログラムの起動時に渡されたコマンドラインの引数を、数値に変換してるんだけど、それだとバグっていて動かないね。
811:デフォルトの名無しさん
08/01/14 14:19:43
806の日本語がバグっとる
812:デフォルトの名無しさん
08/01/14 16:12:11
変換前:This
変換後:hisTay
変換前:is
変換後:siay
以下のコードで上のように出力して欲しいのですが上手くいきません
何故でしょうか?
int main() {
int i;
char s[256] = "This is a pen", *word;
word = strtok(s, " ");
printLatinWord(word);
word = strtok(NULL, " ");
// wordに"ay"が入る。何で?
printLatinWord(word);
return 0;
}
void printLatinWord(char *word) {
char *alp;
/*
通俗ラテン語風に変換して出力
※先頭の文字を末尾に移し、その後ろにayを付加する。
*/
printf("変換前 : %s\n", word);
strncpy(alp, word, 1);
alp[1] = '\0';
strcat(word, alp);
strcat(word, "ay");
printf("変換後 : %s\n", &word[1]);\
}
813:デフォルトの名無しさん
08/01/14 16:29:28
>>812
char *alp;
ポインタにぶちこむな
char alp[1000];
的な感じにしないと
814:デフォルトの名無しさん
08/01/14 16:32:59
>>812
strtokは、与えた文字列(この場合s)の中を書き換えながら、そこを指すポインタを直接返す。
たとえば、"This is a pen" を与えると、strtokは最初
"This\0is a pen"
↑
ここを返す。文字列は\0で終わる決まりなので、"This"が得られる。2回目は
"This\0is\0a pen"
↑
ここを返す。"is"が得られる。3回目は
"This\0is\0a\0pen"
↑
ここを返す。"a"が得られる。
こういう動作なので、帰ってきた文字列に直接strcatで追加すると、
後ろの文字列(=次に返される文字列)が書き換わってしまう。
つまり、そのprintLatinWordを実行すると、sの中は
"ThisTay\0a pen"
のように書き換わり、次にstrtokが返すはずだった "is" は "ay" になってしまう。
815:812
08/01/14 16:42:27
>>813
なんとなく*alpになってしまいました
まだ違いが良く分かってないので頑張って勉強します
>>814
wordを書き換えるとsも変わってしまうんですね。なるほど
丁寧にどうもです
*wordをword[256]に、word = strtok(s, " ");をstrcpy(word, strtok(s, " "))に直して上手くいきました
816:デフォルトの名無しさん
08/01/14 16:55:04
大学の課題で一部分からない点があるので、よろしければヒントをお願いします。
#include<stdio.h>
#define MAX 10
int inputnum(int num[]){
int i;
for(i=0;i<MAX;i++){
scanf("%d",num[i]);
}
return num[];
}
int main (void){・・・・・・と続くのですが、
上記のサブ?ルーチンに表記の間違いがある場合、修正せよという問題です。
ですが配列の返し方など全て自習ということでここで止まってます…。
構文にエラーがあるというところまで分かっているのですが、
どうすえればいいか分かりません。ご教授願います。 orz
817:816
08/01/14 16:56:30
For文が見にくくなってしまいすいません…。
よろしくお願いします。
818:デフォルトの名無しさん
08/01/14 16:59:05
void inputnum(int num[]) {
int i;
for(i=0; i<MAX; i++) scanf("%d", num + i);
}
819:デフォルトの名無しさん
08/01/14 17:00:36
>>816
return 0;とでもしておけ
返さなくても渡された中身は書き換わってる
なんでかはポインタについて勉強せんと・・
820:デフォルトの名無しさん
08/01/14 17:06:48
scanf("%d", &num[i]);
もでした
821:816
08/01/14 17:17:55
>>818,>>820
丁寧にありがとうございます。
>>819
ということは>>818の通りvoid宣言でいいのですね…。
後でじっくり調べてみます。ありがとうございます。
822:デフォルトの名無しさん
08/01/14 17:21:48
int inputnum(int num[], size_t num_size)
{
int i;
for(i=0; i<num_size; i++)
if(scanf("%d", &num[i]) != 1)
return 0;
return 1;
}
823:816
08/01/14 17:58:20
>>822
すみません、「size_t num_size」とは何でしょうか?
また戻り値がどこの変数へ戻るのか分かりません…。
また1つ分からない事があるのでどなたかご教授お願いします orz
サイズを指定せずに配列を作る事は可能でしょうか?
int num[];
//これでは要素が無いためサイズが0であるのでできないということまで
分かりましたがそれ以上で詰まっています。
よろしくお願いします。
824:デフォルトの名無しさん
08/01/14 18:04:39
>>823
size_tは型。たぶんunsigned intと同じである環境が多いのかな?
要は自然数用型とか思っとけばとりあえずOK。(サイズにマイナスはないからね)
戻り値がどこに入るかは呼び出し側次第。
int func( void )という関数があったとして
main内で「int a = func( );」 としてればfunc内の戻り値がa内に入る。
825:デフォルトの名無しさん
08/01/14 18:06:53
>>823
サイズを指定しない配列は無理
malloc系を使えば好きな大きさで確保したり、大きさ変えたりはできるけど
826:デフォルトの名無しさん
08/01/14 18:08:05
char s[] = "もけあ";
とかはできるけどそれは宣言のときだけね
827:816
08/01/14 18:32:46
>>824
詳しくありがとうございます。
int inputnum(int num[], size_t num_size)
メインルーチンの方で上の2つの変数の値を指定すればいいということですね。
>>825-826
明確にありがとうございます。
入力する回数を予め決めるか、
要素次第ということですね。大変参考になりました。
皆さんありがとうございました。
828:デフォルトの名無しさん
08/01/14 18:59:16
int func(int num){
return !(num%2);
}
上記の関数でnumが奇数の場合と偶数の場合の戻り値はそれぞれどうなりますか?
有識者の方宜しくお願いします。
829:デフォルトの名無しさん
08/01/14 18:59:55
タメセカス
830:デフォルトの名無しさん
08/01/14 19:06:49
算数じゃん。
831:デフォルトの名無しさん
08/01/14 19:07:11
>>828
何がわからんのだ?%演算子か?!演算子か?
関数や戻り値がわかってるのならどっちかだろうな。
num = 2;
num % 2 == 0;
!0 == 1
num = 1;
num % 2 == 1;
!1 == 0;
こんなもんでわかるだろ。
ってか>>829で良かったかな。
832:デフォルトの名無しさん
08/01/14 19:08:07
自己顕示欲・・・
833:816
08/01/14 21:14:46
すみません。また1つ疑問ができてしまいましたのでご教授お願いします… orz
配列inputのサイズ変数MAXをサブルーチンで決定したいのですが、
int MAX;
void sub(int MAX){
scanf("%d",&MAX);
}
int main(void){
input[MAX];
・
・
・
}
とした時に、「sub(MAX);」をどこで定義すればいいのでしょうか?
それともルーチンではできないでしょうか?
よろしくお願いします orz
834:デフォルトの名無しさん
08/01/14 21:18:07
(^ん^)?
835:デフォルトの名無しさん
08/01/14 21:18:29
とりあえずC言語における「定義」の意味を調べなおした方が
836:デフォルトの名無しさん
08/01/14 21:19:26
日本語でおk
MAXの値はどこでも変えられるけど?
MAX = 4;とか好きにすれば?
それとも配列のサイズ変えたいの?
837:816
08/01/14 21:19:52
>>833訂正です、すみません。
void sub(int MAX){
scanf("%d",&MAX);
}
int main(void){
int MAX, input[MAX];
・
・
・
}
838:816
08/01/14 21:22:24
>>835
すみません、定義ではなく呼び出しでした。ご指摘ありがとうございます。
>>836
サイズを入力で指定したいのですが、そのプログラムはサブルーチンで記すことが条件です。
839:デフォルトの名無しさん
08/01/14 21:25:06
>>833
若干エスパー。
丸写しはどーかと思うけど、こういうことか?
void sub(int *MAX){
scanf("%d",&MAX);
}
int main(void){
int MAX;
int *input;
sub(&MAX);
/* int input_NG[MAX] <- これはムリ。配列の宣言では定数しか使えない */
input = malloc(MAX * sizeof(int));
・
・
・
free(input);
}
840:816
08/01/14 21:37:44
>>839
ご回答ありがとうございます。
分かりづらくなってしまい申し訳ございません。
int MAX = 10;
int main(void){
int main[MAX];
・
・
・
このように、最初から数値を指定するのではなく、
MAXの値をscanf等の入力で毎回変更することはできませんか?
またできる場合、それをサブルーチンでまとめられますか?
イメージはこんな感じになります。
scanf("%d",&MAX);
int input[MAX];
何度もすみませんがよろしくお願いします。
841:デフォルトの名無しさん
08/01/14 21:53:30
>>840
一応そのイメージで839を書いたんだけど・・・。
要はmallocを使いたくない(or知らないので分からない)ってこと?
どうしても配列ってことであれば、おそらく分からないだろうけど
C89ならムリ。C99なら出来る。
つまりコンパイラによる。
例えば俺が知ってるうちではVCでは出来ない。gccは最近のであれば出来る。
842:816
08/01/14 21:53:33
>>839
/* int input_NG[MAX] <- これはムリ。配列の宣言では定数しか使えない */
すみませんようやく意味が分かりました。
本当に詳しくありがとうございました。
843:816
08/01/14 22:01:13
>>841
#include <stdlib.h>とセットでちらっとだけ見た事があるので
調べて分かれば使えると思いますが、分からないということでお願いします。
別のプログラムで指定した値をファイルに出力し、当プログラムで読み込むというような方法はあるのでしょうか?
844:デフォルトの名無しさん
08/01/14 22:08:52
>>843
とりあえずfopen辺りでファイルの入出力ができるよ(他にもあるけど)
それも分からないの?
845:816
08/01/14 22:17:29
>>844
そこは以前にある程度習っているので復習すればできると思います。
ありがとうございます。
846:デフォルトの名無しさん
08/01/14 22:18:52
>>843
>調べて分かれば使えると思いますが、分からないということでお願いします。
お願いされてもwww
とりあえず十分に大きい固定サイズの配列を用意するか、
mallocを調べるのが良いと思うよ。
847:816
08/01/14 22:34:59
>>846
>お願いw
すみません余計でした^^;
>固定サイズ
とても参考になりました。
0〜固定サイズまでで値を指定することならできそうです。
ありがとうございました。
時間があればmallocを扱えるようにしたいと思います。
848:デフォルトの名無しさん
08/01/15 16:44:03
質問。
ハッシュ法について勉強してるんだけど、格納されたデータ(学籍番号と氏名)を読み取る際に、学籍番号の数(生徒数)を読み取る部分的なプログラムが分かりません。
どういう構文使えばいいでしょうか?
読み込みはこんな感じです↓
/* データファイルの読み込み */
if ((fp=fopen("DATA","r"))==NULL){
printf("File \'DATA\' is not found !\n");
}
while ( fscanf(fp, "%d %s", &data_zipcode, data_address) > 0 ) {
printf("%d : %s\n", data_zipcode, data_address);
/* データの格納 */
if ( StoreData(data_zipcode, data_address) == 0 ) {
printf("Hash Table is full !\n");
}
}
fclose(fp);
849:デフォルトの名無しさん
08/01/15 17:05:19
>>848
ファイル内のデータの総数を知りたいなら、一回空読みすればよかろ。
つーか、それってハッシュ法と関連するのか?
850:デフォルトの名無しさん
08/01/15 17:50:05
>>849
ハッシュするための下準備。んで、出来ました。ありがとうございました。
851:デフォルトの名無しさん
08/01/15 20:06:23
if ((fp=fopen("DATA","r"))==NULL){
printf("File \'DATA\' is not found !\n");
}
いっつも思うんだけどさ、これって何したいの?
ファイルオープン失敗したまま処理続けるなよ
852:N
08/01/15 20:07:27
ナップザック問題を解説付きで教えてください。
853:デフォルトの名無しさん
08/01/15 20:17:11
>>851
その箇所だけならなんとも言えんだろーがw
854:デフォルトの名無しさん
08/01/15 21:25:42
#include <stdio.h>
#include <stdlib.h>
#define MAX_LINE 128
int main(void);
int main(void)
{
char buf[MAX_LINE];
int n;
printf("降水確率を入力してください。\n");
gets(buf);
n = atoi(buf);
ptintf("降水確率は %d %% です。\n", n);
if (n >= 50){
printf("傘を忘れずにね。\n");
}
else {
printf("傘はいりません。\n");
}
printf("いってらっしゃい。\n");
return(0);
}
/*これ↑のどこが悪いのか教えてください*/
855:デフォルトの名無しさん
08/01/15 21:31:57
gets(),ptintf,return(0);
856:デフォルトの名無しさん
08/01/15 21:47:31
ていうかなんでmain関数にもプロトタイプ宣言してんの?
857:デフォルトの名無しさん
08/01/15 22:01:51
>>852
ググった方が早いと思うよ。
検索ワードはナップザック・ナップサック・動的計画法とかで
アプレット使った図解解説ページがあったと思う。
C言語の質問というよりアルゴリズム全般、数学の方が分野としては近いと思う。
858:デフォルトの名無しさん
08/01/15 22:39:47
mainクソワロタwwwwwwwwwwwwwwww
859:デフォルトの名無しさん
08/01/16 01:21:59
>>854
>/*これ↑のどこが悪いのか教えてください*/
降水確率が40%でも傘を持たせない根性。
860:デフォルトの名無しさん
08/01/16 07:03:52
グレゴリウス暦の定義を利用して入力された日は何曜日か計算するにはどうしたらいいでしょうか?
861:デフォルトの名無しさん
08/01/16 07:28:06
>>860
つ[time.h]
862:デフォルトの名無しさん
08/01/16 07:31:21
>>860
ツェラーの公式
863:デフォルトの名無しさん
08/01/16 08:29:24
>>860
適当な起算日からの日数を計算して7で割ったあまりを得よ。
864:デフォルトの名無しさん
08/01/16 16:44:51
typedef struct{
int data[100];
} test;
int func(const test *x);
int main{
test data;
... //省略
for(i=0; i<10000; ++i){
int temp;
temp = ...; //省略。dataの要素を使ったなんかやたら複雑な計算
func(&data);
printf("%d", temp);
}
return 0;
}
ちゃんとしたコンパイラなら、
funcの引数がconstポインタだからループ中でdataの値は変更されない、と解釈して
毎回やたら複雑な計算をするようなことはしないように最適化してくれますよね?
865:デフォルトの名無しさん
08/01/16 16:48:20
ちゃんとしたコンパイラがあればね。
866:デフォルトの名無しさん
08/01/16 16:57:04
ないんですか?
たとえばVCとかgccではどうですか。
867:デフォルトの名無しさん
08/01/16 17:03:13
自分で確かめろ
868:デフォルトの名無しさん
08/01/16 17:18:47
いやgccもVCも持っていなくて……
アセンブラも読めないし
869:デフォルトの名無しさん
08/01/16 17:21:57
なら入手して確かめればいいじゃん。
870:デフォルトの名無しさん
08/01/16 17:22:36
constなんかキャストすればいくらでも外せるからな・・・最適化してしまうわけにはいかんような気がする
871:デフォルトの名無しさん
08/01/16 17:42:48
>>864
そんな保証はどこにも無いから素直にループの外に出しておけ。
自分の為だけなら好きにすりゃいいけど、他人が読むなら言いようの無い不安感
(このコードを書いた奴はまともな人間知性を持っているのか・・・他にも問題ありそうだな・・・)
を煽るだけだからやめておけ。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5378日前に更新/237 KB
担当:undef