C言語なら私に聞いてYO! 49

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問してYO!
むしろ質問する前にWEBで検索するのが常識だYO!

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへ行ってYO!
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへ行ってYO!

コンパイラを探しているなら >>2 を見てYO!

上記を逸した場合の結果は激しく未定義とするYO!

C FAQ 日本語訳
http://www.catnet.ne.jp/kouno/c_faq/c_faq.html
Cプログラマ必読 ・プログラミング言語C(通称 K&R)
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/

前スレだYO!
http://pc3.2ch.net/test/read.cgi/tech/1041127646/
2デフォルトの名無しさん:03/01/16 00:57
( ゜Д゜)ポカーン・・・
      __     
     l⊆⊇`ヽ ≡ ヤホー----イ
     (´D`Lノ ≡   
    m=○=mノ) ≡ もうスレ立ってた気がしる〜
    _/_/(「_ノニコ ≡
     ( (0)=(__)0) ≡(´⌒(´⌒;;
4デフォルトの名無しさん:03/01/16 01:04
>>3
嘘だろ?
800以降は確認したけど・・・
>>1
立てる前に確認しませう
http://pc3.2ch.net/test/read.cgi/tech/1042640474/l50
つーわけで>>1は削除依頼だすやうに
>>5
スレ立てたのなら現行スレに報告しろよ
75:03/01/16 01:36
>>6
それは立てた香具師に言ってくれ
8sss:03/01/16 04:04
sss
>1=6
おまえのチェックミスを棚に上げんな
>>9
禿同。>>1はアフォ。早く削除依頼しなさい。
>>9=10
自作自演でした。テヘッ
>>12
自作自演でした。
>>12
見ればわかります
14デフォルトの名無しさん:03/01/17 20:37
void func(char **);

main()
{
char a[100][100];

func(a);

return 0;
}

void func(char **a)
{
}

↑のようにやったらプログラムが暴走したんですが
対処法はいかに?
void func(char a[][100])
16劉邦:03/01/17 20:56
C言語を応用できる言語は何ですかね?
PHP
19劉邦:03/01/17 20:59
>>18
PHPやったことないんですが・・ほんとに応用できるのですか?
20デフォルトの名無しさん:03/01/17 21:27
int a = 4.3;
abs(3.5);
とかのミスってlintで検出できますか?
>>16
まあ、当然のことですけど
C++
C言語の感覚で書かれたC++はクソコード
>>23
誰もそんなことは聞いていない。
C++はオブジェクト指向なのになんでCが応用できるのかと小一時間(略
26劉邦:03/01/17 21:56
逆にCに応用できる言語は何ですか?
27デフォルトの名無しさん:03/01/17 21:59
awk
C++
C++言語の感覚で書かれたCはクソコード
>>23
誰もそんなことは聞いていない。
結局、CとC++は、繰り返しや比較などが同じなだけであって
設計方法は全然違うわけだな。
32デフォルトの名無しさん:03/01/17 22:17
>>22
ありがとう。でもそこに書いてあることをほとんど
やってくれなかった。
33豚キムチ:03/01/17 22:24
質問!!
C言語ってDVDなどにあるプロテクトもC言語に一種ですか?
34_:03/01/17 22:28
教えてください

Cでsnprintfを自作することになりました。
参考になる資料とかありましたら教えてください。
フリーで使えるソースが何処かに落ちていると良いのですが。
>>34
VC++ならCRT\SRCフォルダに。
36_:03/01/17 22:34
>>35
レスどうもです。
VC++見てみたのですが、うーん難しい事してるんですね。
FILEポインタの中身なんて、いじった事無いです。
これprintf系で汎用的に使う為にこんな感じで実装してるのかなー?
そのまま使いたいところだけど、多分ライセンスで引っかかりそう・・・
>>34
マルチいくない!
>>36
つーか、なんで...

> Cでsnprintfを自作することになりました。

なんてことやってんの ?
40デフォルトの名無しさん:03/01/18 16:00
win上でgccを使っているのですが、
*.libのファイルを*.oなんかに変換できますか?
>>40
別に *.lib のままでいいのでは?
何か不都合でもあるのん?
お答えありがとうございます。
ファイルフォーマットが認識されない、といわれたので。
単に対応していないだけなのでしょうね。
まあ、至急必要なものでもないですし。。。
>>42
あ、すまん。
*.a じゃなくて *.lib か。
なるほど。
分離ってできたっけかな...。
>>42
win 上の gcc とは何者で、その *.lib はどっから持ってきたものかを書けよ。
45デフォルトの名無しさん:03/01/18 18:04
これからC言語を始めてみようという初心者です。
LSI CってのをDLしてみたんですが、使い方がよく分かりません。
参考書買ってみたんですが動かし方については詳しく載ってませんでした。
どなたか詳しく教えていただけませんか?
46デフォルトの名無しさん:03/01/18 18:08
lsc ファイル名
以上
47デフォルトの名無しさん:03/01/18 18:28
ごめん、うそ>46
lcc ファイル名
lcc.exeにちゃんとパスを通すこと
あと、_lccも自分の環境に合わせて編集すること
あとは、read.me読めば書いてるよ
48デフォルトの名無しさん:03/01/18 20:04
えっと・・・
まだよくわからないんですが、
MS-DOSを開きますよね。
lcc filename
しますよね。
次は何をすれば動きますか?
>>48
エラーメッセージが出なければ、もう何もしなくていい。
5045:03/01/18 23:04
やりかたは分かったんですが、
コマンドまたはファイル名が正しくありません
とでます。
どうすればいいですか?
しつこくてすいません。。。
51デフォルトの名無しさん:03/01/18 23:11
>>50
MS-DOSのコマンドラインから

SET PATH=%PATH%***

と入力して

lcc filename

としてみてください。***の部分はパス名(C:\...\LCC\BIN;)です。
ちなみにBINはBINARY(二進)の略で実行可能ファイルが入ったフォルダの
名前として常識です。わかりましたか?
52デフォルトの名無しさん:03/01/18 23:15
>>50
51ですが追伸です。参考になればいいのですが、_lccファイルです。

# LSI C-86 compiler's configuration file

-DLSI_C
-XC:\LSIC330C\BIN -LC:\LSIC330C\LIB -IC:\LSIC330C\INCLUDE -T -O
-acdos.obj $LSICOPTS
&#Command line argument will be inserted here
-lknjlib -ldoslib -v
53デフォルトの名無しさん:03/01/18 23:20
うぜぇ
Cそのものとは関係ねえ事書くな
54デフォルトの名無しさん:03/01/18 23:24

    ∧ ∧___  ダッコ♪
   /(*゚ー゚) /\
 /| ̄∪∪ ̄|\/
   |        |/
     ̄ ̄ ̄ ̄

>>54
大人しくしていなさい。
56デフォルトの名無しさん:03/01/18 23:56
セグメンテーション違反ですってなんですか?
57デフォルトの名無しさん:03/01/18 23:58
>>56
変なとこに書き込んだりしたときに良く出る。
5856:03/01/19 00:02
どこが間違ってるのかさっぱりわからんです...
変なとこをかいたりしたときに良く出る。
>>58
セグメンテーション違反は一番良く見るバグだと思うので、
頑張って間違った箇所を探しませう。

・配列の添え字が変な位置を指しているかどうか
・ポインタの扱いが間違っているかどうか

の2箇所を重点的に調べましょう。
>>59
それはコアダンプ。
6256:03/01/19 00:11
>>60
ありがとうございます。
がんばって探してみます。
卒論間に合うか不安。。。
>>62
・・・デバッガ使えよ・・・
6456:03/01/19 00:16
>>63
!?そ..それはいったい....?
emacsとかについてるやつですか?
>>64
gdbとか
6656:03/01/19 00:21
>>65
emacs見てみたらgdbなるものを発見いたしました!
しかし英語表記のため使いかたがいまいちわからぬ。
調べてみます。。。
67デフォルトの名無しさん:03/01/19 00:33
memsetでdouble型の配列の値を全てdouble x;
にすることはできますか?
>>67
できない。
69デフォルトの名無しさん:03/01/19 00:41
了解!!
デバッガという言葉も知らない奴が卒論までにgdbを使えるわけがない。
デバッガgdbの簡単な使い方。

まずプログラム作成 hoge.c
#include <stdio.h>

main(){
int *a = NULL;
*a = 0;
}


コンパイル時に -g オプションをつける
gcc -g -o hoge hoge.c
実行プログラムをgdbの引数に指定
gdb hoge

gdbのプロンプトが出たらrunを実行
(gdb) run
フォールトエラーなどが出たら、理由と場所を教えてくれる。
Program received signal SIGSEGV, Segmentation fault.
0x8048468 in main () at hoge.c:5
5 *a = 0;

終了するときはquit
(gdb) quit
72デフォルトの名無しさん:03/01/19 14:36
初歩的な質問で申し訳ない。

ファイルからコンソール画面に一行一行読み込んで表示するという、
超基本的なプログラムを書いてみました。
そこで質問なのですが、今のままでは、改行は何も表示されない空白で表されますよね。
この改行部分に「----ここは改行です-----」といったメッセージを表示したいのですが、
どうすればいんでしょう?とりあえず自分が書いたものを↓に。

#include <stdio.h>
void main(){

  FILE *fp;
  char a[20];
  fp = fopen("text.txt" ,"r");

  do{
    if (fgets(a ,20 ,fp) == NULL){
      printf("//////終わりです//////\n" );
      break;
    }else{
      if (a == ""){ ★★★問題の箇所です
        printf("-----ここは改行です-----");
        printf("%s\n" ,a);
      }else
        printf("%s\n" ,a);
      }
  }while(1);
    fclose(fp);
    return;
}
>>72
if(a=="") を if(*a=='\0') に変更すればいいのでは?
>>72
まず、fgets() って読み込んだ改行をそのまま a[] に入れちゃうから、

printf("%s\n", a) なんてやると、一行毎に空行が入るけどいいの ?

あと、要件として行が改行のみなら、"----ここは改行です-----" と表示すると言うのなら、>>73 でいいけど、「何も表示されない空白」の代わりに"----ここは改行です-----" と表示すると言うなら、ちょっと難しいぞ。
>>72
if (strlen(a))
a[strlen(a) - 1] = '\0';

ってのを付け加えた方がいいかも。
76デフォルトの名無しさん:03/01/19 15:56
if (strcmp(a, "\n") == 0)
にすればええんでない?
まぁ簡単に
if (a[0] == '\n')
でもいいか。

あとは
・改行の場合はわざわざ a を表示しようとする必要は無い
・do-while じゃなくて、while 内で fgets を使ったので構わない。
・fp が NULL かどうかのチェックは入れる癖をつけておくが吉。
・最後の行にのみ改行が無い場合があることを考慮するべし。
ってとこでしょうか。
77デフォルトの名無しさん:03/01/19 15:58
>>72
#include <stdio.h>
int main()
{
 FILE *fp = fopen("text.txt", "r");
 char a[20];

 while (fgets(a, 20, fp) != NULL) {
  if (a[0]=='\n')
   printf("-----ここは改行です-----\n");
  else
   printf(a);
 }
 printf("//////終わりです//////\n" );
 fclose(fp);
 return 0;
}
>>77
printf(a); と printf("%s", a); は違う。
7977:03/01/19 16:15
>>78
ごめんうっかりしてた。
printf(a)はprintf("%s", a)に読み替えて。

>>72
あなたのコードを見て思ったことを書きます。
だいたい>>76さんが言ってくれてるけど。

・fgetsは改行も読み込むのでprintf("%s\n",a)でなくprintf("%s",a)。
・0回以上の繰り返しのときは基本的に, do-whileでなくwhileを使う。
・文字列の比較はstrcmpを使う。a==""としても文字列の比較ではなく
 文字列のアドレスの比較が行われるだけで無意味。

あと>>77のコードでも19文字ジャストの行を読み込むと誤動作します。
19文字ジャストの行を読むと, 次回のfgetsで改行文字だけを読み込む
ので, 文末の改行と空行との区別がつかなくなるためです。
a[]の配列を十分大きくとることで簡単に解決します。
> printf("%s", a)

漏れは fputs(a, stdout) のが好きだ。
81デフォルトの名無しさん:03/01/19 18:46
72です!皆さんのご指摘でうまく動くようになりました。
質問の箇所だけではなく、他の様々な部分まで指摘してもらって、感謝してます。
判定文ごとwhileの中に入れろとか、>>77さんの19文字ジャストでおかしくなる・・・とかの話は、
読みながらハタと手を打ってしまいました。

>>80
速度面で有利とか、エラーでにくいとか、そういったことが何かあるんですかね?
単に好みの問題でしょうか。
速度は大抵fputsのほうが速いだろう。
必ずじゃないけど。
83デフォルトの名無しさん:03/01/19 22:00
教えてください!
return (
x1 >= x2+width2 || x1+width1 <= x2 ||
y1 >= y2+height2 || y1+height1 <= y2
) ? false : true;
ってどういうことですか??
>>83
if(x1 >= x2 + width2) return false;
if(x1 + width1 <= x2) return false;
if(y1 >= y2 + height2) return false;
if(y1 + height1 <= y2) return false;
return true;

と同じだよ。多分2つの領域の重なり判定と思う。

8583:03/01/19 22:18
ふむふむ
確かゲーム系で、当たり判定のところっぽい関数だったからそうなのかも!
「||」って、「OR」だったと思うのですが、三項演算子って順々に判定してfalseやtureを返すんですか?
なんか質問部分がわかりにくいーー・・・
>>85
> 三項演算子って順々に判定してfalseやtureを返すんですか?

三項演算子 xxx ? yyy : zzz は、単に xxx の値の真/偽によって yyy か zzz を返すだけ。

順々に判定するのは、|| (論理 OR 演算子) の方。

xxx || yyy は、xxx が真なら yyy を実行しないで 真 を返す。
(短絡演算で、ググッてくれ。)
8783:03/01/19 22:39
ありがとう!ググってきましたー。なるほど。よくわかりました
お世話になりました!
88デフォルトの名無しさん:03/01/19 22:50
Cで書いたプログラムなんですが、コンパイルは通るのに実行するとエラーが起こります。
デバッグ(と呼んでいいのかどうか分かりませんが)したいのですが、
どのように行うのでしょうか。
コンパイラはgccをMS-DOS上(MinGW)で使っています。
>>88
そんなのソースださないと分かるわけ無いだろ。
せめてどうエラー出るのか書けや。
90デフォルトの名無しさん:03/01/19 23:01
>>89
やはりソースによって変わってくるのですね。
一般的にどのようにやっていくのかお聞きしたくて、書き込みました。

エラーは、エラーログを作成しています。というメッセージと共に
プログラムが強制終了します。
>>90
> エラーは、エラーログを作成しています。というメッセージと共に
> プログラムが強制終了します。

.... で、そのエラーログとやらはあるのか ?
プログラムを少しづつ削っていって、エラーが出なくなったら直前に
削ったところが、エラーに関係するところだ。大抵は、
つーか、エラーログ出てるなら読めよとりあえず(w
>>88
gdb(gcc用のデバッガ)ないの?
なければprintfとassertと根性でバグ捜せ。
95デフォルトの名無しさん:03/01/19 23:19
>>91>>93
エラーログの読みかたわからないです。スマソ
実行したフォルダを探しても該当するようなファイルが見つかりません。
>>94
gdbというものは落としてすぐ使えるでしょうか?
探してみます。明日提出の課題なんです。
>>92
やはりそれですか・・・

皆さんどうもアリガd
>>95
おいおい、システムのエラーログに記録されとるんだろ。
実行フォルダには無いぞ。
97デフォルトの名無しさん:03/01/19 23:26
>>96
見方教えてください。
お手数かけてほんとスマソ
>>97
だから、OSは何なんだよ(藁
何も情報書かずに推測するスレか、ここは。
恐らくLinux系だろうけど、君じゃ無理だ多分。その様子だと。
>>98
>>88 もアフォだけど、お前も相当だな。

> コンパイラはgccをMS-DOS上(MinGW)で使っています。

素の MS-DOS はエラーログなんか記録しないだろうから、どうせ Windows の MS-DOS プロンプトじゃねーのか ?
どうせ MAP ファイルなんか見れないんだから、素直に >>92>>94 の2行目に従えよ。
100デフォルトの名無しさん:03/01/20 00:06
100desuyo
>>77
> printf("-----ここは改行です-----\n");

printf("-----ここは空行です-----\n");
102デフォルトの名無しさん:03/01/20 11:39
厨質問で申し訳ないのですが

while(fgets(buf, 256, infp) !=NULL){
hoge = atoi(buf);
printf("hoge=%d\n",hoge);
}

とやりますと、全部のhogeが0となってしまいます。
読みこんだファイルは4行に渡る30バイトほどの
テキストファイルなのですが・・・

どなたかご教授オネガイイタシマス。
>102
入力ファイルの内容を晒してみ?
104デフォルトの名無しさん:03/01/20 12:30
>102
printf("%s",buf);
でちゃんと、bufに文字列読み込まれてるか確認してみる。
103の言うとおり、どんな入力ファイルやねんやろ・・・
atoi関数の使い方もわかっていますか?
105デフォルトの名無しさん:03/01/20 13:21
103,104サソ
アリガdございます。

テキストファイルを
345504
45454
3920
5503
こんな感じに直したらできますた。
文字が入ってたのがいけなかったのでしょうか?
atoiを使う際に"x"などの文字が混入していた際に
無視する方法ってあるのでしょうか?

ほんと厨ですみませそ。。。
106デフォルトの名無しさん:03/01/20 15:55
あるプログラムを作成しました(長いので載せれません)。
そのプログラムはある配列変数の要素を小さく設定した時は
問題なく動いてくれるのですが、大きくするとsegmentation Failureがでます。

gdbをつかってデバッグしました。そしたら、
(gdb) core a.out.core
Core was generated by `a.out'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/lib/libm.so.2...(no debugging symbols found)...done.
Reading symbols from /usr/lib/libc.so.4...(no debugging symbols found)...done.
Reading symbols from /usr/libexec/ld-elf.so.1...(no debugging symbols found)...
done.
#0 0x80489ab in main ()
(gdb) where
#0 0x80489ab in main ()
#1 0x8048506 in _start ()
となり、何行目に問題があるのか?という情報は教えてくれません。
どこがおかしいか、長年の経験のある皆様にお聴きしようと思ったしだいです。
助けて下さい。
107106:03/01/20 15:56
(gdb) where
#0 0x80489ab in main ()
#1 0x8048506 in _start ()
が問題なんですよね?
これってどういう意味ですか?
どんなプログラムかも配列をどういうふうに使ってるのかも要素数をどの程度にしたのかもわからないのに答えろというのか・・・
109デフォルトの名無しさん:03/01/20 16:00
>105
atoi()はスペースと+-以外の文字とぶつかるとそこで終了しちゃいますよ
もしかしたら、文字を取り除く関数があるかもしれないけど
自分で取り除くコード書いたほうが柔軟性あっていいかもしれないですね
110106:03/01/20 16:04
>>108
じゃーのせます。
連続投稿なるけどごめんなさい、どこが悪いか全く分りませんので
enumとmainだけとりあえず載せます

#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

enum {
MAX_NODE = 87381, /* 自分で計算 (( pow(4,MAX_DEPTH) -1 ) / 3) */
MAX_RES = 81, /*ネットワーク内のリソースの種類*/
MAX_DEPTH = 9, /*木の深さ*/
MAX_SIM = 100, /*シミュレーション回数*/
REPEAT = 2 /*繰り返し数 シミュレーション数*/
};


111106:03/01/20 16:05
main()
{
int i,j,k,query,query_number,num_reg,sum_query_number,sim_num,sum_num_reg,num_resource[MAX_RES],node[MAX_NODE][MAX_RES],rt[MAX_NODE][4][MAX_RES];
double adv_num_reg,adv_query_number;
FILE *outp;

srand((unsigned int)time(NULL));
sum_query_number = 0;
sum_num_reg = 0;
for( sim_num = 0 ; sim_num < REPEAT ; sim_num++ ){
/*ノードの登録を初期化*/
node_initialize(node);
/*ルーチングテーブル初期化*/
rt_initialize(rt);
/*リソース数を決定*/
for(i=0; i<MAX_RES; i++){
num_resource[i]=(int)(num_normalcurve() + 0.50);
/*printf("%d\n",num_resource[i]);*/
}
/*各ノードごとの各リソースの登録情報をセット*/
distribute(node,num_resource);
/*MATRIX表示*/
/*print_matrix(node);*/
for(k=0;k<MAX_SIM;k++){
/*QUERY決定*/
query = query_produce();
/*printf("query %d\n\n",query);*/
/*routing開始*/
route(query,node,rt);}
112106:03/01/20 16:06
query = 3;

/*count the number of the query 3*/
query_number = count_qnum(query,rt);

/*rt表示*/
/*print_query(query,rt);*/
sum_query_number += query_number;
printf("query_number %d",query_number);

/*ノードAの登録数*/
num_reg = sum_reg_num(rt);
sum_num_reg += num_reg;
printf("registration_number %d",num_reg);
}
adv_query_number = (double)(sum_query_number) / (double)(REPEAT);
adv_num_reg = (double)(sum_num_reg) / (double)(REPEAT);

printf("adv_query_number %f",adv_query_number);
printf("adv_num_reg %f",adv_num_reg);

}
70〜140MBもスタックに取るつもりかよ
114106:03/01/20 16:11
>>113
そこが問題ですか?enumんとこですよね?
115ccc:03/01/20 16:16
http://www6.ocn.ne.jp/~endou/index2.html
      ★こんなサイト見つけました★
116106:03/01/20 16:30
age
>>116
何だよ、解決したんじゃなかったのか?
スタックに取りすぎだっつってんの

int i,j,k,query,query_number,num_reg,sum_query_number,sim_num,sum_num_reg,num_resource[MAX_RES],node[MAX_NODE][MAX_RES],rt[MAX_NODE][4][MAX_RES];

これがどれほど巨大なメモリを必要とするかわかる?
118106:03/01/20 16:33
>>117
どうやったらいいのでしょうか?
main関数から変数をおいだせばいいのでしょうか?
配列をなくせばいいのでしょうか?

enumは関係ないのですか?
まず第一にバッファの使い方を見直すべし
んな巨大な配列が本当に必要なのか?
どうしても必要ならmallocなり何なりでヒープに取るべし

enumの値を配列サイズに使ってんだから関係あるに決まってる
120106:03/01/20 16:41
>>119
分かりました。
配列を変更するのは難しそうですので、
別の変数を直して行きます。
mallocとか勉強します
121デフォルトの名無しさん:03/01/20 17:55
ぷろぐらむの実行がいつまでたっても終らん。
実行を早くする基本は何?
>>121
プロファイラ使え。
123デフォルトの名無しさん:03/01/20 18:14
>>109さそ
ありがdございます

while(fgets(buf, 256, ifp) !=NULL){
for(i=0; i<strlen(buf); i++){
if(isalpha(buf[i])){
こんな感じでアルファベットだったらbufからその文字を省くといった
仕様にしたいのですが、bufからその文字だけ省くことなんて
可能なのでしょうか?

再度の糞厨質問ですいません。
ご教授オネガイイタシマス。
124デフォルトの名無しさん :03/01/20 18:21
VC++買おうと思って製品情報見てるとVisual Studio .NETのページに行っちゃうんですが
Visual Studio .NET て何ですか?
>>124
VB,C#,VC++が全部入り
126デフォルトの名無しさん:03/01/20 18:35
11万円もするよぉ!うわぁーぁぁん
127デフォルトの名無しさん:03/01/20 18:43
ある4つほどの配列をファイルに書き込もうとして、
fwriteを使って書き込みました。
別のプログラムでそれを読み込もうとしてfreadで読み込んだのですが、
読み込んだ配列の中身が途中から0になってしまっています。
具体的には
a[130][100],b[100][30],c[100],d[30]を書き込んで
読み込んだaおよびbが途中から0になっていました。
けれどもcとdは正常に読み込めていました。
エラーチェックはしていますがエラーは出ていません。

プログラムも見直していますが、さっぱりわかりません。
どなたかご教授願いまつ。
>>126
ほんとに全部要るのか?
>>121
実際のものより小規模なモデルを作り、プログラムが正しく動作しているかを検証する。
各処理の実行時間を調べて、時間がかかっている部分を高速化する。
(但し、複雑になるような高速化は避ける。)
いくつかの規模のモデルを実行して、時間を測定し、実際のモデルでどれだけ時間が
かかるかを見積もる。
時間がかかり過ぎるようなら、別のアルゴリズムを探す。
別のアルゴリズムが見つからなければ、複雑な高速化に取り組む。
それでも時間がかかり過ぎるなら、プログラムを作ることの意義を見直す。
>>123
省いた後、隙間を詰める。
もしくは、省く文字以外を別バッファにコピーする。
131デフォルトの名無しさん:03/01/20 19:02
>>123

#include <ctype.h>を追加して、

char tmp[256], *src, *dst ;

for ( src=buf, dst=tmp; *src; src++ ) {
  if ( isdigit( *src ) || *src=='-' || *src=='+' )
    *dst++ = *src ;
}
*dst= '\0' ;
hoge= atoi( tmp ) ;

但し、これだと "-1 2 +3" が "-12+3" になってしまうから
それいう可能性があるなら加工しる!

123で、"アルファベットだったらその文字を省く" って言ってるから、
if ( !isalpha( *src ) )
  *dst++ = *src ;
のほうがいいかな。
先頭の空白は無視するというatoiの仕様を利用して、余計な文字をスペースに置き換えたら?
「アルファベットだったら」じゃなくて「数字か+,-でなかったら」の方がいいと思うけど。
>>127
ファイルサイズが期待した通りになっているかを確認。
ファイルの中を見てみて、0が書かれているようなら、
fwrite、そうでなければ読み込みがfreadを見直す。

たぶん、二次元配列のサイズ計算が間違えているんだと思う。
途中からとかではなくて、実際にどこから0が書かれているかを
調べるのもいいと思う。(地道なことをちゃんとやらんと)
>>127
読み込むときも書き込むときもバイナリモードにした?
あ、UNIX系なら関係ないけど。
>>128
全部いらなくても、商利用したいときとか…

ところで、シェアウェアって、やっぱ商利用?
>>136
そりゃそうでつ。
138127:03/01/20 19:34
細かい訂正ですが、b[100][32]でd[32]でした。

>>134
カエレ!(・∀・)とか言われそうですが、
ファイルサイズの計算はどうすればいいのでしょうか・・・
バイナリファイルの中身はどうやって見ればいいのでしょうか・・・バイナリエディタですか?
二次元配列のサイズ計算というのがよく分からないのですが・・・
今いろいろと検索していますがよく分かりません・・・

aはa[30][0]から0になっていて、bはb[7][6]から0になっています。

>>135
WindowsのCygwinってやつでやってます。
一応fopenにはwbやrbはちゃんと書いているので
大丈夫だと思います・・・
139デフォルトの名無しさん:03/01/20 19:38
Visual C++ .NET Standard
買おうと思いますがどう思われますか?
VBは弄った事あります
スレ違い祭りか?
141デフォルトの名無しさん :03/01/20 19:45
Visual C# .NET
Visual C++ .NETて何が違うんですか?
>>138
Cygwin なら
ls -l ファイル名
でファイルサイズが見れますよ。

バイナリファイルの中身は
dump ファイル名 | less
(less でなく more でもいいです。お好きなほうを)
で見れます。
>>141
C#とC++という時点で違う。
>>138
> ファイルサイズの計算はどうすればいいのでしょうか・・・
printf("%d", sizeof a);
もしくは
sizeof(aの型) * 130 * 100
として計算。あとはバイナリなんで、a, b, c, dを全部足せばよい。

> バイナリファイルの中身はどうやって見ればいいのでしょうか・・・バイナリエディタですか?
バイナリエディタもしくは16進ダンプするツールを探す。
なければ作れ。(簡単だから)
予想では0は書かれていないと思う。

> 二次元配列のサイズ計算というのがよく分からないのですが・・・
> (略)
> aはa[30][0]から0になっていて、bはb[7][6]から0になっています。
c, dは大丈夫で、a, bが駄目というんで、二次元配列の扱いが間違えているんだと思う。
fwrite()のところで3000や1350という数を渡してしまっている。
3000は130 * 100 を 30 * 100にしてしまっているとか…
>>139
いいんじゃない
146127:03/01/20 21:00
>>142
>>144
ありがd。
とりあえずプログラムもう一度見直して
ファイルの中身見たりしてみまつ。
>>139
Visual C++ .NET Standard は
最適化が無くて、できた実行ファイルも配布禁止だったような。
完全に学習用なんで、それでもいいんなら買ったんでいいんでは?
>>137
自明というわけでは無い気がしますけども…
>>147
フリーなら配布可でつ。
150127:03/01/20 22:13
デキタ━(゚∀゚)━!!!!
>>134,>>144両氏指摘のように、
原因はfwriteおよびfreadの書き込み、読み込み数指定が間違っていたようです。
プログラムでは
fwrite(a,sizeof(double),input*middle,fp)
といったように書いていたのです。
inputとmiddleはdefineであらかじめ定義してありました。
特にinputは
#define input aho+bakaといった形で・・・
今まで本当に知らなかったのが恥ずかしいくらいなのですが、
この状態でinput*middleってやるとaho+baka*middleってことになるんですね・・・
てっきりahoとbakaの和がinputに入るんだとばかり思ってました・・・
#define input (aho+baka)で解決しますた。(´・ω・`)

書き込みから間違ってることが判明したので、
25時間かけたデータを取り直しまつ・・・(´・ω・`)

>>144氏の言うとおり、出力ファイルのサイズはsizeof(double)が8だったので
8*(130*100+100*32+100+32)=130656Byte が正しかったのですが、
質問時の出力ファイルは28kByteくらいでした・・・
今考えると8*(31*100+7*32+6+100+32)=27696Byte だったのですね・・・

みなさまありがとうございますた。ご迷惑おかけしますた。逝ってきまつ。
>>150
お疲れ様
(´-`).。oO 150は経験値が1上がった
153139:03/01/21 00:19
>>147
ありがとうございます。
Visual C++ と Visual C++ .NET の違いは何でしょうか?
154デフォルトの名無しさん:03/01/21 00:28
>>147
マジで!?
箱には・・・

「学習用を目的とした製品となります。
 商用製品など、本格的なアプリケーションの開発は、
 Visual Studio .NET Professional 以上の製品をお勧めいたします。」

・・・と、あるけど・・・?
あくまで、お勧めであって・・・
ダメとはどこにも書いてないっぽい。
今から、もうちょっとマニュアル読んでみる。
155デフォルトの名無しさん:03/01/21 00:45
staticってなんれすか?
静電気
>>155
自動変数をstatic領域に配置することだよ
static int a;
とかって宣言すると、その関数終了しても内容の保持が保証されるのです
>>157 ( ゚д゚)
>>157
つーことは
static int foo(void);
と言う関数は、static領域に配置されるから内容の保持が保証されるけど
int foo(void);
と言う関数は、内容の保持が保証されないのですね?
160デフォルトの名無しさん:03/01/21 01:01
void analysis(int ch)
{
static int repeat_count = -1; /* < 0 は無効値 */
int i;
if (ch == 'F' || ch == 'R' || ch == 'L') {
if (repeat_count < 0) repeat_count = 1;
for (i = 0; i < repeat_count; i++) {
switch(ch){
case 'F': forward(); break;
case 'R': right_turn(); break;
case 'L': left_turn(); break;
}
}
repeat_count = -1;
} else if (isdigit(ch)) {
if (repeat_count < 0) repeat_count = ch - '0';
else repeat_count = repeat_count * 10 + ch - '0';
}
}

丁寧に説明してくらさい。
>>159
関数は変数なんですね?
162154:03/01/21 01:02
>>147
ってことで、ザッと見てみたが・・・
どこにも、作ったバイナリの配布を禁止してる下りもないし、
また、商用アプリを作ってはダメって下りもない。
あくまで推奨。お勧め。

作ったバイナリ配布しても、
シェアソフト作ってもOKっぽいぞ。
163デフォルトの名無しさん:03/01/21 01:03
>>159
( ゚д゚)< ポカーン
164デフォルトの名無しさん:03/01/21 01:04
>>157
サンクス!
165デフォルトの名無しさん:03/01/21 01:08
>>160
たとえば"15FR160L"という文字列があったとき,
それを先頭から一文字づつanalysisに渡すと,
forwoard()が15回, right_turn()が1回,
left_turnが160回, の順で実行される。

staticの解釈はこの場合>>157で合ってるから, あとは自分で追ってみれ。
166デフォルトの名無しさん:03/01/21 01:12
>>159
static の関数は同じファイルの中からしか
直接呼び出すことが出来ないんじゃなかったっけ?
>>160
>/* < 0 は無効値 */
ってコメントは的外れと思うのは気のせい?
168デフォルトの名無しさん:03/01/21 01:20
if (repeat_count < 0) repeat_count = 1;  ここか?
169デフォルトの名無しさん:03/01/21 01:21
>>165
サンクス!!
170デフォルトの名無しさん:03/01/21 01:24
else if (isdigit(ch)) {
if (repeat_count < 0) repeat_count = ch - '0';
else repeat_count = repeat_count * 10 + ch - '0';

コメント風に解説おながいします。
>>167
ん?なんで?
数字が何桁続くかわからないから、下から4行目の
if ( repeat_count < 0 )
の行で1桁目なのか2桁目以降なのかを判定するためでしょ?

カキコする前にreloadしてみたら >>170 の答えにもなってた。
>>170
>isdigit(ch)
chのアスキーコード値が数字の文字かどうかの判別

>ch - '0' 
文字0のコード値で引く
173デフォルトの名無しさん:03/01/21 01:32
>>172
あたりまえじゃん
>>173
175デフォルトの名無しさん:03/01/21 01:33
>>171
>>172
サンクス!!!
横突っ込みでスマソが
>>172
そんなコメントは書くなよ
>>171
スマソ、完全にボケてました
コピペしたから気づかんかったけど
/* 0 は無効値 */
ではなく
/* < 0 は無効値 */
だったんですね…首吊ってきます
178171:03/01/21 01:45
>>177 まだ生きてる?
なるほど。
確かに -1 ってハードコーディングしてるんだから
/* -1 は無効値 */
のほうが読みやすいかも知れませんね。
>>177
見間違えは誰でもあるYO まあまあ気を落とすなw
>>160
これってこの前オレが書いたやつじゃん。
ちなみにあのコメントはrepeat_countが負の値をとらないよって意味。
だから-1かどうかではなく、負かどうかの判定になっている。
つか、NULL を無効値にすればいんじゃ・・・?
数字検出時に何桁目なのかを意識しなくても

if ( isdigit(ch) )
  repeat_count = repeat_count * 10 + ch - '0' ;

で済むし。
但し、入力が "0R"とかの場合に>>160とは挙動が変わってしまうが。

まぁ、他人の課題にそこまで考えてやる必要ないし。気ぃ悪くしたらスマソ。
>但し、入力が "0R"とかの場合に>>160とは挙動が変わってしまうが。

まさにこれが負値を無効値にしてる理由じゃないの?
>>181
どこから突っ込んで欲しいの?
184180:03/01/21 03:44
>>181
理由は、>>182 さんの言っている通りです。
-の入力は流石にないだろうけど、0はあるだろうと思って。
質問には書いてなかったんで、どちらでもいいと思いますが。

あと、同じ人?って書いたのもオレです。
185182:03/01/21 03:54
まぁ前処理で0はカットできるけどね。
ちゃんとassertなりで0を受け付けないと表明するなら
>>181もアリかも。あと0->NULLだけど逆は必ずしも真ならず。
>>185
何でNULLは突っ込んで
挙動が変わるのは"R"等であって
"0R"等ではない事に突っ込まないかな…
187デフォルトの名無しさん:03/01/21 04:21
gccのライブラリファイルのリンクトラブルは
どうやって解決するのがいいんでしょうか?
よく,-L,-lのオプションが足りないと,
undefined reference to `xxxxx'
と文句いわれるけど,
そのファイルがどのライブラリにあるとか,
どうやって調べたらいいんでしょう?
>>187
nm
>>187
grep
190182:03/01/21 10:04
>>186
0を無効値にするってことは, ふつう無効値チェック部分の,
if (repeat_count < 0) repeat_count = 1;
を,
if (repeat_count == 0) repeat_count = 1;
と書き換えることを含意するんじゃないの?
191デフォルトの名無しさん:03/01/21 10:51
130-133サソ
アリガトウゴザイマシタ

while(fgets(buf, 256, ifp) !=NULL){
for(src=buf, dst=tmp; *src; src++){
if(! isalpha(*src))
*dst++=*src;
}
*dst='\0';
hoge = atoi(tmp);
printf("hoge = %d",hoge);
fprintf(ofp, "%d\n", hoge);
}
ご教授頂いたように修正したところ
無事仕様とおりに動きました。
192デフォルトの名無しさん:03/01/21 12:01
質問なのですが
引数で渡したファイルに
バイナリで書きこむとは
どういったことなのでしょうか?

例えば32という2バイトを32と1バイトにして
書きこむといわれたのですが・・・
あまりにも意味がわかっておりません。

どなたかご教授お願い致します。
>>192
fopen() で "wb" モードで開け。
char 型の変数に 32 を代入して fwrite() で書け。
終わったら fclose() で閉じろ。
>>192
とりあえず >>127-150 あたりを読んでください。
>>162
そうだったんだ...。
VC5の頃はダメって書いてあったと思うので、
特にいいって書いてないだけでも
ダメなんだと思い込んでしまったのかも。
196デフォルトの名無しさん:03/01/21 20:19
age
>>157
> 自動変数をstatic領域に配置することだよ

それって自動変数じゃねーだろ。
(今時誰も書かないけど、auto ってキーワードもあるし...。)

> static int a;
> とかって宣言すると、その関数終了しても内容の保持が保証されるのです

グローバル変数/関数のスコープには触れなくて良いのか ?
auto って書いてた時期ってそもそもあるの?
K&R の時代のことはよー知らんのだが。

>>155
1.関数の外に書いた変数や関数につけた場合
その変数や関数の名前がそのファイル内でしか通用しなくなる。

2.関数の中の変数につけた場合
その名前が関数の中でしか通用しないことを除いて
グローバル変数と同様の扱いになる。
(つまり、初期化は実行前に決まる値でしか行えず、
 初期化を省略すれば 0 で初期化される。
staticとグローバルはメモリまわりでちょっと違うんじゃなかったか?忘れたが
>>198
> auto って書いてた時期ってそもそもあるの?
> K&R の時代のことはよー知らんのだが。

最近の香具師は、規格も知らんのか ?
(まあ、普通は省略できるから気にしなくてもいいんだが。)

>>199
>>198 の 2. の意味では、まず同じ。(よほどひねくれた実装は除くが...。)
逆に、同じ静的変数でも初期化指定子がない (or 0 で初期化) 場合と、0 以外で初期化する場合で異なるメモリセクションに配置する処理系は多い。
>>198
そもそも、日本語で自動変数って
autoを直訳しただけだからね…
202198:03/01/22 00:08
>>200-201
auto ってのがあることくらい知ってるけどさ、
でも、使ったことないんで。
いや、とりあえず使ってみたことはあるが。
register もそうだなー。
VCとか無視するって書いてるし。
autoって書くのって時代遅れっぽぃ?
204デフォルトの名無しさん:03/01/22 00:17
>>197
>それって自動変数じゃねーだろ。
>(今時誰も書かないけど、auto ってキーワードもあるし...。)
そういわれたらそうかも(^^;
へんないいまわしだw
staticで宣言した瞬間にautoじゃなくなるもんね
>グローバル変数/関数のスコープには触れなくて良いのか ?
うーん、staticってなんでしか?って聞いてる人にあんまり難しいこといってもなぁ〜
って思いまして。

つまるところは内容が保持されるってことがいいたい。

そうすると、スコープの話になりますね・・・

>>(今時誰も書かないけど、auto ってキーワードもあるし...。)
う〜ん、C始めて、8年やけど、いまだかつてautoキーワード使ったこと無いわw
使うことってあるの?
205デフォルトの名無しさん:03/01/22 00:17
registerは要るよ! ほんとに速くなるか良く知らないけど
volatileは要るよ!
207デフォルトの名無しさん:03/01/22 00:26
>>205
ん〜大概のコンパイラは最適化の段階で勝手にregisterつかってくれるんじゃないの?
registerは最適化のヒントにしかならない。本当にレジスタ使って
くれるかどうかはわからない。
x86のようなレジスタが少ないCPUならなおさらその傾向が強い。
>>204
ソースを見やすくする為に使う
取り敢えず、最優先したい変数はregisterを使い
レジスタに割り当てて欲しくない変数はvolatileを使い(←正しい使い方と違うけど)
レジスタが余ってる場合にはレジスタに割り当てて欲しい場合はautoを使えば
ソースを見た時に、明示的に優先するべき変数が分かるようになる
ちなみに、省略された変数は、一時的なもので最終的には使わない予定の変数
そんなにごちゃごちゃ書いてたら
鬱陶しいことこの上ない(w
見やすくするためにautoやvolatileなどの機能を伴う(とされている)
修飾子を使うのは誤り。するべきは変数名の工夫、コードの構成。
autoは使わない w
registerは優秀なコンパイラを使っていれば必要ないんじゃない?
volatileは・・・・それを必要とするほど高度なプログラムを俺は書いたことがないw

俺は上の三つは使ったことないな。signedも使ったことないかも
213212:03/01/22 02:11
みんなは外部のファイルから参照される関数の頭にexternをつける?
俺はデフォルトでexternになっているからつけないんだけど。
プロトタイプにはつける人もいるみたいだから。
>>213
漏れはつけない。無駄だと思ふ。
無意味といえば単項演算子の+もauto同様、無意味だよな。
extern int i; /* 宣言 */
void foo()
{
  :
  i++; /* 参照 */
  :
}
int i ; /* 定義 */

これをstaticでやりたい場合はどうするの?
ファイル内でしか通用しないのだから
普段は宣言無しで定義を一番上に書く事にしてるんだけど
出来たら、それは、それで少し便利かなと…
217デフォルトの名無しさん:03/01/22 04:15
int* p;
p=malloc(sizof(int), 100);
で動的に確保したpの配列要素数を調べるにはどうすればいいでしょう?

sizeof(p)ならsizeof(int *)がもとまってしまいます...
もちろんサイズ100ってわかってるのになんで?ってのは
なしでおねがいします.
>>217
出来ない。いじょ。
>>217
その100を覚えておけばいいだろ
221217:03/01/22 04:33
>>218
そうですか...

>>219
そういわれると基も子もありません...

>>220
今からよんできます.
>>216
一応
static int i; /* 定義 */
にすればできる。

でも、そういうのはできるだけ一箇所で済ませたいと思うけどね。
2箇所で整合性とらなあかんのは面倒。
関数の場合は前方参照問題とかあるから
static でもプロトタイプ宣言するのは有意義だけど、
変数では滅多にそういう問題ないから不必要っしょ。
>>221
要するに、何か変数に保存しときんしゃいってこと。
224217:03/01/22 04:46
>>223
どうもありがとうございます.

単純に考えたら...
お恥ずかしい限りです

225219:03/01/22 04:53
>>221
覚えておけばいいってのは、変数に入れておけばいいという意味なんだが、伝わらなかったか。
226デフォルトの名無しさん:03/01/22 05:01
>>225

>>225
そこまで頭がまわりませんでした...

文字どおり”覚えておけ”ってことだと解釈してもうた
227219:03/01/22 05:01
>>217
ところで、mallocの引数はひとつだよ。
callocでも意味上では引数の順番が逆だな
228216:03/01/22 07:32
>>222
ありがとうございます
関数だと駄目なので、変数も駄目だと思い込んでたんですけど
変数の宣言はexternで良かったんですね
>>228
> 関数だと駄目なので、変数も駄目だと思い込んでたんですけど

何で駄目だと思ったんだ?
プロトタイプに extern とか書いたのか?

#include <stdio.h>
static void hoge();
int main()
{
  puts("main");
  hoge();
  puts("main");
  return 0;
}
static void hoge()
{
  puts("hoge");
}
>>228
> 変数の宣言はexternで良かったんですね

よくない。
いや、悪くないが、気持ち悪い。
関数内でも、変数は頭に宣言するだろう。
変数を後ろに宣言する何の必要があるのか?
「元も子も」じゃなかったけ?勘違い?
>>231
元金と利子だからな
233デフォルトの名無しさん:03/01/22 19:17
032 #なんだかnandaka
038 #あそこがasokoga
214 #むず痒いmuzugayui
314 #なんでだろnanndedaro
286 #なんだか切ないnanndakasetsnai

↑こんな感じの複数行のテキストファイルがあり、
このファイルを引数で渡すと
数字のみファイルに書きこむプログラム
(#以降はコメントのようにみなす)を
作成していたのですが、変更があって
032 #なんだかnandaka
ne #あそこがasokoga
214 #むず痒いmuzugayui
↑のように数字以外のものがあっても
変換する必要性が出てきました。
今まではisdigit()で済ませていたのですが
それでは2行目の"ne"が弾かれてしまいます。

そこでどのようにすれば#以降を弾きつつ
先頭行の数字以外のデータを書きこむように
できるのかをお教え頂きたくカキコしております。

ほんと厨房で長々と乱文でスイマセソ
5教授お願い致します。。。
>>233
書き込むって何に書き込むんだ?
文脈から判断できない
メモリーか?
235234:03/01/22 19:24
ああ、わるい。ファイルか。
236234:03/01/22 19:26
>>233
strchrで#までの長さを求める。
なければ行末までとする。
237236:03/01/22 19:27
言い方が悪いな。
strchrをうまく使って長さを求める。
strcspnを使ってもいいけど
isdigitの代わりにisgraphをつかう
23910000:03/01/22 19:29
C言語でいまCGI作ろうとしているんですが
とりあえず文字表示するだけとかやってみたわけなの
printf("<HTML>");みたいに。
それをコンパイルしてXREAってトコロにUPしてみたの
だけど・・動かないの・・・EXEをCGIにリネームしてUPしたのに。
・・・・なにがわるいんでしょう・・・??
240236:03/01/22 19:30
>>239
・コンパイルした環境がxreaと違うから
・Content-Typeヘッダーを出力していないから
>>239
EXEとか言っているあたりWindows上でコンパイルしたな・・・・
xreaはLinux(CPUはIntel系)だから。
24210000:03/01/22 19:34
printf("Content-type:text/html\n\n");
こんなん付けていましたが・・・ダメでした・・。
環境はVCなんです。・・うーぬ。
レスありがトン。
トクトクでコンパイルしたものをXREAにアップすれば動くかも
24410000:03/01/22 19:38
Windowsじゃだめなのですか!!
それは気付かなかった・・っていうか知らなかった〜
Linux対応にするにはどうすればいいか、わかります・・?
>>233
strtok(バッファの内容を改変してもいいとき)
もしくは strchr(よくないとき)を使う。

>>242
: の後は空白を空ける。
printf("Content-type: text/html\n\n");

>>244
Linux 上でコンパイルする。
>>245
他のバッファにコピーするならsscanf(src,"%[^#]",dest);こんな感じかな?
>>244
自分とこでLinux環境整えてそこでコンパイル、が一番楽なんじゃないかなぁ…
Cygwin使えばWIN上でLinuxバイナリ作れる?
ttp://www.sixnine.net/cygwin/cygwin-doc/devel/cygwin-to-linux-cross-howto.html
24810000:03/01/22 20:24
Linuxヵー自分全然わかんないッス・・・。
まだ遠い道なのかな・・。
249セグメントフォルト:03/01/22 20:54
レンタル鯖でCGIするなら、やっぱperlとかの方がいいっしょ。
実験用に自前鯖つくるか
*.cgi の中身ってどんな言語?
ってか、コンパイルされた状態なの?
テキストソースなの?
>>250
実行できるなら何でも。
>>239のことなら>>239を読めば分かると思うけど・・・

> C言語で
> それをコンパイルして
253252:03/01/22 22:07
そういう意味か・・・

標準入出力と環境変数にアクセスする機能があれば言語は問わない。
Cで書かれたものならもちろんコンパイルしないとだめ
254251:03/01/22 22:32
>>252
確かにそういう意味かもしれんな...。

>>251 に補足するなら、サーバが許可してない形式のは実行できなかったと思う。
インタプリタ言語なら、もちろんインタプリタがサーバに置いてないと実行できない。
ホームでインタプリタを自前でコンパイルして使うという手もあるが...。
255デフォルトの名無しさん:03/01/22 22:57
const struct ABC {int i;} a;
struct ABC b;

ってすると、なんで a しか定数にならないのー?
型限定子なのに
書き換え不能なstruct ABC型のaだからじゃない・・・
何がおかしいんだろ・・・
257困った1 ◆tr.t4dJfuU :03/01/22 23:03
int findpos(char s[], int lim)
{
 int i;

 for (i = 0; s[i] != '\0' && i < lim; i++)
 {
  ;
 }
 if (i == lim)
 {
  while (i >= 0 && (s[i] == ' ' || s[i] == '\t'))/*@*/
  {
   i--;
  }
 }

 return i;
}

@の条件が常に偽になるのはなぜなのでしょう?
free()でsegmentation faultが発生するんですが考えられる原因は何でしょうか
>>258
・mallocで得た領域でない。
・既にfree済み。
const struct ABC {[?[struct]?] int i;} a;
261困った ◆tr.t4dJfuU :03/01/22 23:18
「困った1」ではなくて「困った」でした。スマソ。
>>257
常に偽になるわけないでしょ。
findposに与える引数を工夫してみな。
>>259
それ以外にも、ポインタとかの使い方間違えてて、メモリ管理がぐちゃぐちゃになってるとか...。
>>230
>変数を後ろに宣言する何の必要があるのか?
関数でも変数でも定義や参照の後ろで宣言するのは意味無いし
265258:03/01/22 23:27
>>259,263
1)でした...
静的に確保した領域を開放しようとしてました.
どうもありがとうございました.
266デフォルトの名無しさん:03/01/22 23:43
>>255
それで正常です。
構造体の定義の部分に const をつけても、
その構造体変数を作ろうとした場合に const になるわけではありません。
定義の部分でついでに定義した構造体変数が const になるのです。

常に const になって欲しいんならこんな感じで。
typedef const struct __ABC {int i;} ABC;
ABC a = { 0 };
ABC b = { 5 };
267困った ◆tr.t4dJfuU :03/01/22 23:46
>>262
ありがとうございます。
その方向で工夫してみます。
>>198
再帰関数を書いたときにauto変数であることを明示するために書いたことがある。
269デフォルトの名無しさん:03/01/22 23:51
>255
>const struct ABC {int i;} a;
だと
const struct ABC a;
でって、ABCがconstになるわけじゃないですからね。
そもそも、型を定数にしてなんかいいことある?

あえてするなら
struct ABC {const int i;};
かな?

270デフォルトの名無しさん:03/01/23 00:08
sizeof honyaraと、sizeof(honyara)って何か違いますか?
don't worry.
>>270
#define honyara honya + ra
後は自分で考えませう
273デフォルトの名無しさん:03/01/23 00:37
>>269 です。
んー、簡単なプログラムかいて、色々実験してみたんだけど、
結果は、同じになります。
あんまり悩む事じゃないのかな??
>>272
それは、そんな定義する奴の方が悪いと思うけど。
>>273
じゃ↓を試してみ
#define honyara 7 + 11
printf("%d\n",sizeof honyara );
printf("%d\n",sizeof(honyara));
型に対してsizeofするときは括弧が必要なんじゃなかった?
>>274
それは同意だが、>>270は、何が違うのか聞いてるので…
>>277
だからと言ってそんな変な例を出してどうする。

sizeof 単一式
sizoof(型名)

と言うだけのことだろ。規格書ぐらい読めよ。
279デフォルトの名無しさん:03/01/23 00:58
>>275さん、どうもです。
なるほど、この場合だと結果は違いますね。

自分の環境だと、
printf("%d\n",sizeof honyara );
これは、15になって、
こちらは、
printf("%d\n",sizeof(honyara));
4になりました。

後者は、sizeof(int)をあらわしてると思うのだけど、
前者はなんだろう?
うーむ、、、、考え中...
>>278
>sizoof(型名)
>規格書ぐらい読めよ。
プッ
>>279
型名に()が必要と言うのは
#define honyara int

typedef int honyara;
の場合
>>278
そうか?俺は勉強になる良い例だと思うが・・・

ところで単一式なんて単語定義されてたっけ?
>>279
sizeof 7 + 11 は ( sizeof 7 ) + 11
sizeof( 7 + 11 ) は sizeof( 18 )
で、あなたの環境の場合 sizeof 7 も sizeof 18 も4だったって事
284デフォルトの名無しさん:03/01/23 01:07
>>281
つまり、一般的には(typedefしない時などは)、両者は同じであるというわけですか?

正直、わかったような、わからないような。
なんだか釈然としないですょ。
285デフォルトの名無しさん:03/01/23 01:09
>>283
なるほど!
非常によくわかりました。

カッコつけることで、優先順位あげてるわけか。
理解しますた。
みなさん、どうもありがとうございました。
>>284
いつでも括弧をつけていれば間違いない。
俺は変数に対してはあまり括弧をつけないけど・・・
>>284
要は、honyaraの正体を知ってる時は、どっちを使っても構わないが
honyaraの正体を知らない時は()使えって事
また、honyaraの正体を知ってても変更する(される)
可能性がある場合も()使えって事
俺はいつもつけるようにしてるな、
つけないとワードとワードが2つ連続して並んじゃってなんか居心地が悪い

hage + sizeof hoge + huge
        ↑ここに何も無いのがキモイ
ところで
sizeof(i++)
のように、変数を変化させる事を書いた場合の
ふるまいって、どうなってるの?
sizeofの中味は評価されないんじゃなかった?
i++の型だけが使われて、iの値は変化しないと
>>289
変数の大きさに変数の中身は関係ないんじゃ?
292291:03/01/23 01:25
ああ、i++が実行されるかどうかということか。
どうだろ・・・
293289:03/01/23 01:30
手持ちのコンパイラは全て変化しないけど
これが、保証済みだったら良いけど
未定義や処理系定義だったら怖いでふ…
まぁ
#define i j++
とかアホな宣言しなければ良いんですけどね…
C++/C99の規格では、(C99の可変長配列を除いて)オペランドは評価されない。
となってる。
295デフォルトの名無しさん:03/01/23 02:30
#include<stdio.h>
main()
{
putchar(126);
}

だと ~ が表示される.(~のコードが126だから)
しかし 。 のコードは130のはずなのに,

#include<stdio.h>
main()
{
putchar(130);
}

と打っても結果が表示されません.これに関して,130〜159までが表示されないみたいなんですが,なぜなんでつかー??おせーてくらさい.
130のコードが'。'では無かったから
>>295
isgraph()で調べてみたら。
スペース以外の表示可能文字なら0以外を返す。
>>295
。 は 161(0xA1) だと思います。

129(0x81) 〜 159(0x9F) はSJISでは2バイト文字用の
文字コードなので、単独では何も表示されません。
299デフォルトの名無しさん:03/01/23 02:53
putchar はコードを文字に変換出力しますが,その逆(文字をコードに)をしてくれる命令はありますか??
300296:03/01/23 02:54
誰も突っ込んでくれない…鬱
301デフォルトの名無しさん:03/01/23 03:00
勉強になります.ここはレベル高杉ですね
ぼけのレベルがですか?
303レゴ其の二:03/01/23 03:15
助けて下さい。
#include <iostream.h>
#include<stdio.h>

void main()
{
FILE *fp;
fp=fopen("素数−実行結果.txt","a");
int i, j ,f,n=1000,c=0;
// 1から1000までの数の素数を求める
// i, jはループ変数
// fは一回でも割り切れたら1。
// 一度も割り切れなかったら0。
for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。
{
f = 0;
for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。
{
if(i % j == 0) // あるjで割り切れたらfは1。
f = 1;
}
304レゴ其の二:03/01/23 03:15
if(f == 0){// iを割り切るjがなかった場合
cout << i << "は素数です。" << endl;
c++;
}
}
printf("%d個です。",c);
}

素数を表示するプログラムなんですが、
実行結果をテキストファイルに出力するにはどうしたら良いですか?
教えて下さい。御願いします。
ちなみに、コレを実行しても、作成されたテキストファイルは白紙になってしまいます。

>>299

printf( "A=0x%02x\n", 'A' ) ;
てっとり早くやるなら、そのプログラムの名前をtestとしたら、
test > hoge.txt
ってしたら、いいんじゃねーか?
面倒くせーから、まともなやりかたは、他の人に聞いてくれ。
>>303-304
お前最悪。
マルチポストかよ。

氏ね。
308レゴ其の二:03/01/23 03:24
実行結果をテキストファイルに出力する仕方を教えて下さい。
御願いします。
なかなかうまくいかないんです。
マルチポストなのでIP抜いて通報しますた
310レゴ:03/01/23 03:27
マルチポストってなんですか?
>>310
複数のスレッドに同じことを投稿する違法行為。
知らなかったじゃ済まされないのが犯罪。
312レゴ:03/01/23 03:30
すいません。
いえ、あちらの方に、MFC限定と書いてあったので、
書き込んだ後で、違うかも知れないと思って、こっちに来たんです。
だから、他には投稿してないです。
ム板はやたらスレが細分化されてるからなあ。
マルチポストと移動の違いが分からない罠。
>>312
ならそう書けよ……
315レゴ:03/01/23 03:35
迷惑掛けてしまったみたいで恐縮なんですが、
どうしたら、うまくテキストファイルに出力できるか、
教えて下さい。御願いします。
>>312
マルチポストが何故いけないのかちゃんと調べておこうな。

>>313
移動はちゃんと移動したと書いてある。
マルチポストと勘違いされるのを防ぐのにな。
317名無しさん@3周年:03/01/23 03:37
「レゴは
 素直に
 単位を
 落とせ。」
向こうにレス付いてたよん。
>>312
>書き込んだ後で、違うかも知れないと思って、こっちに来たんです。
1、書き込む前に確認する
2、移動する時は、必ず、移動すると元スレに書き込んでから移動する
以上、基本ですので憶えて置きなはれ

追記
反省してるならMFC限定スレにも謝っておく事
>>303
それは C++ だが、ここは 「C 限定」 なんだよな。
321レゴ:03/01/23 03:39
316>>
はい、分かりました。

317>>
単位というか、研究室に入れなくなってしまうんです。

322レゴ:03/01/23 03:58
fprintfの使い方分かる方、教えて下さい。
>>322
>>1読んだ?
324レゴ:03/01/23 04:03
読んだんですけど、C言語というと、C++も入ってるんですかね?
違うけど、言葉的に入ってると思ったんですが。違うのでしょうか?
間違ってたら、すいません。
325レゴ:03/01/23 04:06
FILE *fp,*fc;
fp=fopen("素数−実行結果.txt","w");
int i, j ,f,n=1000,c=0;
// 1から1000までの数の素数を求める
// i, jはループ変数
// fは一回でも割り切れたら1。
// 一度も割り切れなかったら0。
for(i = 2; i <= n; i++) // i(==2,3,4,..,1000)について調べる。
{
f = 0;
for(j = 2; j < i; j++) // j(==2,3,...,i)で割ってみる。
{
if(i % j == 0) // あるjで割り切れたらfは1。
f = 1;
}
if(f == 0){// iを割り切るjがなかった場合
cout << i << "は素数です。" << endl;
c++;
}
}
printf("%d個です。",c);
fc=fclose("素数−実行結果.txt","w");
と入力したのですが、エラーが出てしまいました。
>>324
はっきり言われないとわからないか。
>>1 の 2 行目は呼んだか?

あと、C と C++ は全然別言語だ。
327レゴ:03/01/23 04:08
fprintfを使った方が簡単に出来るのですか?
もしかして、両方使わないといけないんですかね?
328レゴ:03/01/23 04:20
326>>
はい。
自分で色々調べたり、先輩に聞いたんですけど、
ここまでしか分からなくて。
本当に頭悪くて、すみません。
329レゴ:03/01/23 04:23
それでは、失礼します。
>>328
まずfopenとfprintfとfcloseの使い方をおぼえたほうがいいな。

なんでfpにファイルをオープンしたポインタを代入してるのにcoutに出力してんだ?
fpをまったく使わない時点でおかしいと思わないのか?
331レゴ:03/01/23 04:35
えっ?
fpに出力ですか?
coutは、使わないんですかね?
初めに素数を表示するプログラムが完成した後で、
テキストファイルに出力出来るようにしようとしたので、
分からなくなったんです。
ちょっと、いじってみます。
C++相談室 part14
http://pc3.2ch.net/test/read.cgi/tech/1041328679/l50

こっちに来れば俺が懇切丁寧に教えてやるが
>>330
優しいね…
>>331
C++として組みたいならXXstream使え(XXは自分で探せ)
何が簡単で、何が簡単ではないかは、使う人の考え方次第
それにネットで検索すればfprintf()の使い方なんて簡単に見つかる
そして、ルールは守れ。
何処で聞けば分からなければ、この板のルールの↓を守って
>あらゆる質問はまずすれ立てるまでもない質問はここでスレにしてください。
http://pc3.2ch.net/test/read.cgi/tech/1043159083/
に書きこんでれば、一発で誰かが答えてくれる問題だった
まぁ、今更書いたところで、答えてくれる香具師がいるかは分からんが…
取り敢えず、>>330が付き合ってくれてるので
Cに直した答えを教えてくれるかも知れないが
C++にしたいのなら明日あたり↑のスレで聞いてみ
334333:03/01/23 04:40
>>332
今日は優しい人が多いね…
いつからレゴはC++になったんだ?
>>335
>>303 の 「助けて下さい。」 のすぐ次の行から。
337330:03/01/23 05:17
>>333
いやま、スレ違いだし、ヒント以上を出すつもりはないんで(w
引き取ってくれるスレがあることだし、この辺で。
338233:03/01/23 11:38
>236 >238 >245サソ
アリガdございますた。

アドバイス頂いておいて何なんですが、
正直strchrを使って"#"以降を弾くのかわかりません。。。
ほんと糞厨ですみませんが、もう少し
5教授頂きたく思います。
お手数お掛け致しますが宜しくお願い致します。
339デフォルトの名無しさん:03/01/23 11:56
C言語の、多分基礎のところだと思うんですけど質問します。

int AAA = BBB != CCC ? DDD:EEE ;

この1行を要約すると、

if( BBB==CCC ) int AAA = DDD ;
else int AAA = EEE ;

ということでよろしいのでしょうか?
int AAA;
if( BBB!=CCC ) AAA = DDD ;
else AAA = EEE ;
341339:03/01/23 12:24
>340さま
ありがとうございました。m(__)m
342デフォルトの名無しさん:03/01/23 12:31
>>338
1. 一行読み出す
2. #の位置を探す
3. 見つかれば、そこまでを書き出す
4. 見つからなければ、全部書き出す

でできます。
一文字ずつ読み出す場合はこういうことできないんですけどね。
一文字ずつ読み出すと何度も読み出し作業があって遅くなるので、
一度にある程度読み出すことが多いです。

まぁ、一文字ずつ読み出す場合であれば、
isdigit とかの関数を使わずに
'#' かどうか判定するのが一番真っ当なやり方でしょうね。
343超初心者:03/01/23 12:31
C言語の長所と短所を教えてください。
>>343
長所: 簡潔であること。
短所: 簡潔すぎること。
345338:03/01/23 13:47
>342サソ
アリガdございます

相変わらず糞厨なもので。。。
3. 見つかれば、そこまでを書き出す
4. 見つからなければ、全部書き出す
上記3.4のコーディング方がわかりませぬ・・・
まじオワッテルって感じなんですけど、
御教授願いたく再度ペコーリでございます。
>>345
3. 位置の差を使って fwrite
4. fputs
何で分岐するかは strchr のヘルプを見れば分かるはず。

fgets で一行読み出そうとしても、
バッファが小さいと一度に一行全部読み出せるとは限らないので、
その対処をする必要があります。
全部読み出せたかどうかは最後が改行かどうかで分かります。

具体的な形については、全部自分でやってください。
347246:03/01/23 14:16
>>345
>>246じゃだめ?確認していないけど。
一行読んだものを格納するバッファとは別にもうひとつバッファをつくってそこにsscanf
>>346
位置の差を取るくらいならstrcspnを使えばいいじゃん
'#'を探して見つかったらその位置とその次に'\n'と'\0'を置く。
行バッファなんか要らないじゃん。
fopen(fpin=入力、fpout=出力)
while(!feof(fpin)) {
fgetc(cに1文字読む);
if(c=='#') {
fputc('\n',fpout);
while(!feof(fpin)) {
fgetc(cに1文字読む);
if(c=='\n') break;
}
}
else {
fputc(cの1文字を書き込む,fpout);
}
}
両file close
exit(0);
>>351
氏ね
353山崎渉:03/01/23 19:59
(^^)
山崎渉も氏ね
355故・山崎渉:03/01/23 21:36
(××)
>>355
ワロタ
357 :03/01/24 09:57
C言語が全然分かりません(>_<)
どうしたらいいですか(>_<)
ほうじ茶を飲むといいですよ (-:
359 :03/01/24 10:06
C言語でほうじ茶のプログラムを書く方法を教えてください(>_<)
360 ◆nonoGOIeGg :03/01/24 10:14
         /
∋8ノハヽ8∈ | 
  ( ´D`) < こーするのれす
          | 

printf("ほうじ茶のプログラム");
361デフォルトの名無しさん:03/01/24 15:31
C言語でいい参考書ありませんか?やさしいCとC言語スタートブックは読んだのですが
次になにを読めばいいのか迷っています、それともはやめにC++の方に移った方がいい
のでしょうか?
363デフォルトの名無しさん:03/01/24 15:42
>>362
ありがとう
364デフォルトの名無しさん:03/01/24 18:36
ど素人な質問でスミマセン。
ファイルから1バイトおきにデータを読み込みたいのですがうまくいきません
なぜこれではダメなのでしょうか?

FILE *fp;
char ch;
.......

while(!feof(fp)){
ch=fgetc(fp);
putchar(ch);
fseek(fp, 1L, SEEK_CUR);
}
FILE *fp;
char ch;
.......

while(!feof(fp)){
ch=fgetc(fp);
putchar(ch);
fgetc(fp);
//fseek(fp, 1L, SEEK_CUR);
}
> while(!feof(fp))

終了条件がこれはマズイだろ。
367デフォルトの名無しさん:03/01/24 19:28
文字を数値に変えるのはatoiとわかりました。
数値を文字に変えるのはitoaですか?
はい
aprintf()
370369:03/01/24 19:45
間違い。
sprintf()
>>364
fgetc の戻り値で終わってるかどうか確かめましょう。
また、fgetc の戻り値は int なので int で受け取りましょう。
FILE *stream;
char buffer[81];
int i, ch;
................

/* 最初の 80 バイト文字を読み出し、"buffer" に格納します。*/
ch = fgetc( stream );
for( i=0; (i < 80 ) && ( feof( stream ) == 0 ); i++ )
{
 buffer[i] = ch;
 ch = fgetc( stream );
}
...................
37334:03/01/24 23:25

1週間位前から、snprintfを実装してた者です。
本日作成終了しました。とりあえず感想等を書いてみます。

文字列フォーマット後のサイズを計算して、
オーバーフローしないなら、
内部でvsprintfを呼ぶ様に実装しました。
でも、何箇所か精度の甘い部分が残りました。
変換指定子g,Gはeかfのどちらかに変換されるらしいけど、
どちらに変換されるか判らないからサイズは大きい方で
計算したり、フラグ#は最小フィールドが指定された時には、
サイズがフィールド幅足す2なのか、最小フィールド幅内に含めるのか等

他の人には簡単なのかも知れないけど、
私には難しかったです。そしてめんどくさかった。
strtok使ってみたら?
375名無し@沢村:03/01/24 23:31
>>373
ヌヒよ、それは実装とは言わないぞ。
ヌヒよ、それは単に作成というぞ。それは単なる関数だからな。
ヌヒよ、実装というのは関数ではなくインターフェイスを定義することだ。
>>372
なんでfread使わないんだろう…
実装って、定義されたインターフェイスに対して
実際の処理内容を与えることじゃないの?
>>376
CRLF -> LF
379378:03/01/25 02:35
勘違いした。
>>375
377 の言う通りだ。
お前それじゃ、本物の沢村より DQN だぞ。
>>380
>>375が本物であるかも知れない罠
>>381
本物ならあんな文の書き方しないよ。
修行が足りないね。
383ひとりでぷよぷよ:03/01/25 05:42
1 6
2 7
3 8
4 9
5 10
↑これを
(a=1;a<6;a++){
(b=a;b<=10;b+=5)
printf("%d",b);
printf("\n");

こうじゃなくて12345と数字の順番に表示させていくにはどうしたらいいですか
>>386
聞く前に動くコードを出せ
>>383
printf("12345\n678910");
>>383
何をやりたいのか見当がつかん。
どういう出力結果が欲しいんだ?
387386:03/01/25 06:00
>>384
ごめん、コードはまた今度な。
388 :03/01/25 06:16
>>386
俺が思うに、1 6\n2 7\n3 8・・・と表示してゆくのではなく、
1から5までを表示したあとに一番上の行間で戻って少し右にずらし6から10までを表示したいんだと思う。
389388:03/01/25 06:17
× 行間で
○ 行まで
390ひとりでぷよぷよ:03/01/25 06:20
1 6
2 7
3 8
4 9
5 10
↑これを
#include <stdio.h>
int main(void){
int a,b;
for(a=1;a<6;a++){
for(b=a;b<=10;b+=5)
printf("%3d",b);
printf("\n");
}
}
こうじゃなくてああ
1 6
2 7
3 8
4 9
5 10
↑こういった出力結果が欲しいだけなんか?
だったら
int i;
for (i=1; i<=5; i++)
 printf("%d %d\n", i, i+5);
これでええやん。
392388:03/01/25 06:25
>>391
それだと1 -> 6 -> 2 -> 7という順で表示されるから嫌なんだと思う。
カーソルを移動させるための関数が必要だな。標準にはない。
393391:03/01/25 06:34
>>392
俺も当初そう思ったんだけど,
>>390を見る限り1 -> 6 -> 2 -> 7と表示させようとしてるような。
394まさかこんなオチ?:03/01/25 06:34
1 2
3 4
5 6
7 8
9 10
395388:03/01/25 06:38
>>393
「こうじゃなくてああ」と書いているから違うコードがほしいんじゃない?
396デフォルトの名無しさん:03/01/25 06:39
エスケープシーケンス
http://kasai86.infoseek.livedoor.com/dos/esc.htm
397391:03/01/25 06:48
>>395
あ, そっか。ごめん。
398デフォルトの名無しさん:03/01/25 07:36
strtokはワークエリアが一つしかないので、だぶって使ったら
ダメだということです
399デフォルトの名無しさん:03/01/25 07:45
なんの話だ
>>399
よう分からんけど、>>398の環境で
同一プロセス内のスレッドが複数ある時の話じゃないか?
401デフォルトの名無しさん:03/01/25 07:58
「Java 謎+落とし穴」のp50参照
402デフォルトの名無しさん:03/01/25 09:44
C言語って関数内関数が使えないはずですよね?
gccだと通っちゃうんですが。何故?
403デフォルトの名無しさん:03/01/25 11:09
>402
gccが独自拡張してるからだYO!
-ansi -pedantic-errors
の、「ANSI準拠以外認めない」オプション付けたらエラーになる筈

ところで
>59、61
の掛け合いに激しくワラタんだが、
反応ないのをみるに、これって激しく既知のネタ?
Not Found.
405デフォルトの名無しさん:03/01/25 14:08
>>403
知らなんだ。イイ! ね。
特に作業用の引数が必要な再帰関数使うときとか。
406402:03/01/25 15:49
>>403
サンクス

というかなんで標準Cじゃ使えないんだよヽ(`Д´)ノ
スコープがちょっと違うだけだろうが!
407デフォルトの名無しさん:03/01/25 15:49
配列の範囲チェックを省きたいんですけど、
こんなのありなんでしょうか?

struct aaa
{
int d1[10];
int data[10];
int d2[10];
};

aaa l;
l.data[-1]=1; //d1[9] //anti bad_alloc
l.data[-2]=222; //d1[8] //anti bad_alloc
>>407
添え字に負数入れてもコンパイラはエラー吐かないんだな。びっくりした
a[n] == *(a+n) と解釈されるから当然といえば当然か。
>>403
-pedanticまでつけなくてもいいんじゃないか?(笑)
以前試しにつけたら、//コメントはおろか標準にない関数をつかっただけでもエラーになった気がする。
410デフォルトの名無しさん:03/01/25 17:35
>>407
C++使い?
>>406
>というかなんで標準Cじゃ使えないんだよヽ(`Д´)ノ
一見簡単そうだが、意外に厄介な問題が潜んでいるので・・・
>>411
まともな関数内関数の実装はスタックフレームにも影響あるからね。
C++やJavaのメソッド内クラスみたいな制限つきでも十分便利なのにな。
>>287
亀レスで悪いが...

> 要は、honyaraの正体を知ってる時は、どっちを使っても構わないが
> honyaraの正体を知らない時は()使えって事

と言うより、

#define honyara honya + ra

なんて宣言する奴が悪い。普通...

#define honyara (honya + ra)

って宣言するだろ。

>>280
規格書も読めないんだね。 ぷぷっ。
>>413
> #define honyara (honya + ra)

> って宣言するだろ。

このくだらないつっこみのために遅レスしたの?
>>413
> #define honyara (honya + ra)

> って宣言するだろ。

#define honyara ((honya) + (ra))
>>414
>このくだらないつっこみのために遅レスしたの?
規格書を読んでいた為ではないかと。
>>414
あんたの意味なし煽り突っ込みよりマシかと。

>>415
趣味の差かと。
念には、念を入れると言う考え方もあるけど、俺はマクロ側で () 必須にするのが好み。

>>416
それもあるが、毎日 2ch 見てるわけじゃないし...。
>>417
>俺はマクロ側で () 必須にするのが好み。

#define a(b) (b * 5)
printf("%d\n", a((4 + 8)));

という意味だったら死刑。
>>418
まあ、話の流れからわかるでしょ ?

「マクロの定義側で」と書いた方がいいか...。
>>417
煽ったつもりはないですけど。
煽っているのは>>413の方でしょ。
>>420
これ (=このくだらないつっこみのために遅レスしたの?) 書いといて...

> 煽ったつもりはないですけど。

と来たか...。

>>413 で煽りがないとは言わんけど、>>280 は見てんのかなぁ。
>>421
驚いたので感想を書いただけです。
亀レスでなければ驚きもしないですけど。
くだらないという表現がまずかったでしょうか。
>>422
> 驚いたので感想を書いただけです。

マジなのか、ネタ (だと思いたいが) なのかわからんけど。
まああんたみたいな奴も世の中にはいるということはわかった。

> 亀レスでなければ驚きもしないですけど。

自分で亀レスって書いといてなんだけど、2日と17時間ぐらいが、驚くほど亀レスか ?
君と違って、毎日 2ch 見てる香具師ばかりじゃないんだよ。

> くだらないという表現がまずかったでしょうか。

相手に対して、「くだらない」と言う表現がまずくない場合があるとでも思ってんの ?
2chだからね。
425デフォルトの名無しさん:03/01/25 22:19
>407
1.構造体のメンバが宣言順にアドレス増加方向で並ぶのは保証されている
2.配列内の要素はアドレス増加方向で並ぶことが保証されている
3.アドレス演算は+で増加方向、-で減少方向が保証されている
だが、
4.構造体の中身が隙間無く並ぶことは保証されていない
に引っかかって誤動作することがあると思われ。

sizeof(int)=4,sizeof(short)=2として、
struct mix{
 short a[1];
 int b[1];
 short c[1];
};
だと、恐らくmix.c[-3] != mix.a[0]になると思う。
ただそれよりも何よりも、そんな危険な匂いのするコード個人的に嫌だw
>>423
あんな書き込みでは2日と17時間でも驚くよ。
大抵は思っても書き込んだりはしないんじゃないかな。
427426:03/01/25 22:26
要は2日と17時間経ってからレスしたことに驚いたんじゃなくて、あんなレスを2日と17時間も経ったあとにしたことに驚いたということ。
>>426
ハイハイ、わかりました。
>>428
わかればいい。
430デフォルトの名無しさん:03/01/25 22:32
二次元配列を引数にとるにはどうすればいいんですか?
int dat[100][100];
void func(int *param);
main(){
  func(dat);
}

のようにやっても、うまくいきません。
void func(int** param);でもだめでした。
教えてください。
-3じゃなく-4かもね、それ。
>>430
void func(int param[][100])
void func(int (*param)[100])

>>430

void func(int param[][100]);
434デフォルトの名無しさん:03/01/25 22:36
ありがとうございます。
でもそれだと、要素数が100に限定されてしまいませんか?
>>434
限定される。
ポインタの指すものの大きさが分からないとだめだろ。
>>425
そもそも配列の範囲外へのアクセスは保証されないよ。

>>429
しつこい、お前等ウザイからどっか逝け。

>>430
void func(int param[][100])

多次元配列の最上位の次元以外の範囲は省略できない。
437デフォルトの名無しさん:03/01/25 22:40
よくわかりました。どうもありがとうございました。
>>436

int data[100 +2], *p;
p = data +2;

とすれば、p[-2], p[-1] が有効に使えるね。
>>437
こうやればできる。

#include <stdio.h>

#define ELEMOF(array) (sizeof (array) / sizeof *(array))

void func(int* param, int n)
{
 param[n * 3 + 6] = 3; /* a[3][6] = 3;
}

main()
{
 int a[10][20];
 func(*a, ELEMOF(*a));
 printf("%d\n", a[3][6]);
}
あ、コメント閉じるの忘れてた。
 param[n * 3 + 6] = 3; /* a[3][6] = 3; */
441デフォルトの名無しさん:03/01/26 00:43
それだと2次元配列の見易さや配列の大きさについての
情報が無くなるから・・
void func(int *param,int n){
/*nは1列の要素数*/
 *(param + 3 * n + 6) = 3;
}
と大差ないと思われ。
これなら通ることは恐らく>430も確認済みと思う。

関係ないが、関数の中にマジックナンバーを仕込むのは
サンプルコードでも止めて欲すぃ・・
>>278==413
>sizoof(型名)
>規格書ぐらい読めよ。
規格書読む前に、アルファベットの綴りを覚えろよ
>>442
typo ぐらいでがたがた言うな。
>>443
エラそーに能書きを垂れる時にミスったらアカンやろ
>>441
数字だと瞬間での同一性の確認が得られるから、
こういうサンプルではマジックナンバーもアリかと思って。

あと、もし第二要素数の異なる二次元配列を扱うのであれば、
それと大差ないのは仕方がないんじゃないかな。
まぁ、
#define INDEX2(n2, a, b) ((a) * (n2) + (b))
とかして
param[INDEX2(n, 3, 6)] = 3;
とでもすればいいかと。
もちろん要素数固定ならこんなことする必要ないんだけどね。
>>417
>>415 が趣味の差かよ!!
447デフォルトの名無しさん:03/01/28 02:24
age
>>442
ルパーン お前をタイポする〜〜
>>448
タイポしてないじゃん
450初心者:03/01/28 15:45
#include<stdio.h>
#include<stdlib.h>
int main (void){
int k,nsize;
int *pnVar;
printf("確保する大きさ");
scanf("%d",&nsize);
pnVar= (int *)malloc(sizeof(int)* nsize);
printf("%dバイトの領域を確保しました\n",4*nsize);
for(k=0;k<nsize;k++);
pnVar[k]=k*10;
for(k=0;k<nsize;k++);
printf("pnVar+%d=%p pnVar[%d]=%d\n",pnVar+k,k,pnVar[k]);
free(pnVar);
return 0;
}
何故かエラーがでます。
授業の板所を間違えて写してしまったのでしょうか
どなたか対処法をおねがいします。
マロック関数です
お前はその前に日本語を学びなおせ。
for文の後にいきなりセミコロンがあるが、それはどうなのよ?
452デフォルトの名無しさん:03/01/28 16:08
↑お前ね、煽り方がふるくせんだよ。 ジジイかよ
Stack overflowと言うエラーは何ですか?
>>452
ヒソヒソ( ゚o゚)ヤダァ(゚o゚ )ネェ、キイタ?( ゚o゚)オクサン(゚o゚ )アラヤダワァ
455木下:03/01/28 16:21
大学の研究でいきずまってるんですけど。助けてください。
まず仕事の数を入力して次に仕事の内容を入力して次に仕事別に分けたいのだけどどうしたらいいの?
ちなみに仕事は丸ブローチ加工、角ブローチ加工、キーみぞ加工の3種類です。
マロック関数ですか。
なんだか新鮮ですな。
>>455
バカ?
458デフォルトの名無しさん:03/01/28 16:24
>455
質問が漠然としてるな
いまいちわからない
研究にかかわってない人間でもわかるように質問して
459デフォルトの名無しさん:03/01/28 16:26
>455
マイコンで旋盤制御でもやるつもりか?
お手製のNC旋盤
>450
少しおちついて考えればすぐ解ると思うが、

for(k=0;k<nsize;k++);/* k が nsize になるまで空回り*/
pnVar[k]=k*10;/* ここでは k は nsize と同じ値になっている*/

となっている。
451じゃないが、for文直後のセミコロンはいったい何なんだと小3分ほど(w
>>450
intの大きさをsizeof(int)と書いているところもあれば4と決めつけているところもあるね。
あ、エラーとはなんの関係もないよ。
462木下:03/01/28 16:49
include<stdio.h>

void main()
{
long sum=0;
short ten[10],i,n;

printf(“仕事数の入力(10個以内):”);
scanf(“%2d,&n);
for(i=0;i<n;++i){
printf(“%2d個目の仕事の入力:”,i+1);
scanf(“%s”,&ten[i]);
sum=sum+ten[i];
}
if(?){
printf(“丸ブローチ加工です。\n”);
}
}
ここで()のなかの条件式がわかりません。仕事の内容を入力する時にmと入力されれば
”丸ブローチ加工”です。と表示したいのです。初心者なのでよろしくおねがいします。
>>462
まずは全角のダブルクォーテーションをなんとかしろ。
次に、なんでshortに文字列を入れようとする?
464木下:03/01/28 16:54
charにすればいいんですか?
>462
sumって何に使うの?
>>465
アムロの(ry
木下君のやりたいことを想像してみよう
>>467
オリンピックで金メダルを取ること。
469デフォルトの名無しさん:03/01/28 17:24
下記のようなプログラムを作成中の厨房です。
/* int hoge */
while((hoge = fgetc(fpin)) !=EOF){
if(hoge=='#'){
fputc('\n',fpout);
while(!feof(fpin)){
hoge=fgetc(fpin);
if(hoge=='\n') break;
}
}
else {
fputc(hoge,fpout);
}
}

*fpoutの示すファイルにバイナリで書きこみたいので
fwriteを使いたいのですが、いまいち使い方が
わかりません。特にfputc('\n',fpout);のところです。
'\n'をどのように引数で渡せばよいのでしょうか?
糞みたいな質問で申し訳ありませんがよろしくお願い
致します。
470デフォルトの名無しさん:03/01/28 17:41
>>469
> fputc('\n',fpout);
fwrite(&'\n', 1, 1, fpout);
でも、1文字書き込みたいだけならfputcの方がいいと思うが...
>>471
> &'\n'
これはCなのか?
てか、"\n"でええやん。
473デフォルトの名無しさん:03/01/28 18:18
>>453
スタックがオーバーフローするエラー。

スタックってのは
自動変数(関数内で普通に定義した変数)、
関数の引数、関数の呼び出し元のアドレスなどを
保存しておくところ。

オーバーフローってのは、容量オーバーすること。

つまり、
1. 自動変数が大きすぎる・多すぎる
2. 関数呼び出しが深すぎる
って時に起こるエラーです。
普通は再帰関数の終了条件が満たされなくなるようなバグがあったときか、
3次元以上の配列を確保したが予想以上に大きくなってしまった、という時に起こります。
474サンコン:03/01/28 18:19
初心者で,数値計算[円周率]のプログラムをC言語でつくりたいのですが
何をしたらいいかわからず,何か参考になるネタはありますか?
476デフォルトの名無しさん:03/01/28 18:22
>474
検索すればその手の例題は結構あります。
478サンコン:03/01/28 18:25
みなさんありがとうございやす。
479デフォルトの名無しさん:03/01/28 18:34
言うと殴られちゃうぬるぽってC言語のNULLのことじゃないんですよね??
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /<<479
481デフォルトの名無しさん:03/01/28 18:44
ミナサン
ご回答ありがdございます。

while((s = fgetc(ifp)) !=EOF){
if(s=='#'){
fwrite("\n", 1, 1,ofp);
while(!feof(ifp)){
s=fgetc(ifp);
if(s=='\n') break;
}
}
else {
fwrite (&s, 1, 1, ofp);
}
}
上記のように直したのですが
ファイルにはNULLしか入ってないっす・・・
まじ厨でもうしわけないのですが
ご教授お願い致します。
>>481
fwrite を使うか fputc を使うかで
バイナリかテキストかは切り替わらないので、
どっちを使っても問題ありません。

というか、
 fwrite (&s, 1, 1, ofp);
は危険な(環境依存な)コードなので
fputc 使って下ちぃ。
483デフォルトの名無しさん:03/01/28 19:06
>>482サソ
ご丁寧な回答ありがdございます。

fputcを使うべしとのことですが
fputcはバイナリで書きこむことが
可能なのでしょうか??
>>482
環境依存なの?
>>481
CPUはなんだ? なんとなくx86系じゃないような香りがする。
>>484
int型のs(多分fgetcを受ける変数なんでintなんだろう)を
*(char*)&s;
と評価したときの値は環境に依存するよ。
fwrite(&s, 1, 1, ofp);
なんてやってる場面はまさにそれ。
487481:03/01/28 19:18
ぐぉーーなんか複雑だぁ。
CPUは・・・?よくわかりますぇん。。。
OSはUNIX、ソラリスであることは
間違いないっす。

fputcじゃーバイナリでカキコは無理なんで
しょうか・・・
>>487
するとsparcかな。エンディアンしらねえや(w
でも書いたファイルがヌルだらけという状況からいって、
ビッグエンディアンっぽいね。

ともかくその場面ではfwriteを使うんじゃなくて、fputcを使うべし。
fputcは文字をストリームに書く関数というよりは、
一バイトストリームに書く関数って感じなので、バイナリ書けるよ。
何か「バイナリ」という言葉を勘違いしている予感。
というか、何をしたいの?
#があるとその行のそれ以降のものを消すコード、
というのなら最初ので合ってるような気が。
490487:03/01/28 19:38
>>488-499サソ
アリガトウゴザイマス

確かに漏れバイナリわかってません。。。
32#more
44#baka
nanoka #utsuda
↑こんな感じのテキストファイル読み込んで
(#以降はコメントの扱いとして省く)
バイナリでファイルに書きこむっていう
プログラムを作っています。

putcでバイナリで書きこめるのであれば
私の仕様でもダイジョウブなんでしょうか?
最近夢にバイナリが出てきます。
鬱です。
491デフォルトの名無しさん:03/01/28 20:02
>>490
32 とか 44 とかをバイナリで書き込むんですね?
でも、nanoka とかバイナリもテキストもないと思いますが
どういう仕様にしたいのでしょうか。
492487:03/01/28 20:11
>>491サソ
アリガdゴザイマス!

おっしゃる通りでして
"nanoka"はそのままカキコで
OKであります。

32やら44をバイナリで書きこみたい
のです。

ご教授お願い致します。
>>492
300get#300geto-
という場合はどうなんでしょう?

何にせよ、fgets で一行読み込んでから処理する方が楽な気がします。
494デフォルトの名無しさん:03/01/28 21:13
age
495492:03/01/28 21:21
>493サソ
fgetsのほうがよいですか。。。
while(fgets(buf, 256, ifp) !=NULL){
for(src=buf, dst=tmp; *src; src++){
if(*src == "#")
*dst++=*src;
}
*dst='\0';
こんな感じでいけますかねぇぇ。。。
atoi って知ってる?
aoiなら知ってる
ぬ★ぽなら知ってる
499492:03/01/28 21:45
hoge = atoi(tmp);
でしか?
走査していって数字が見つかれば atoi、
見つからなければ1文字出力、
を続けていけばいいんじゃない?
>498 フセジ カコワルイ
502492:03/01/28 22:26
>500サソ
500ゲトの暁にそのコード書いて
くださひ。。。
もうアタマがオーヴァーヒートして
だめぽ。。。
ヒント挙げすぎちゃったかなと思ってるくらいなのに...。
504492:03/01/28 22:48
>>503
ソウナンデスヨネェ
まだC言語触って2週間なのに・・・
こんなん漏れに与えるヤシがおかすぃ。
ほんとおながいしますっ!
>>504 ほらよ。行数多すぎとか言われたんで入るように手を加えた。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char * argv[]) {
  char s[512], *p;
  FILE *ifp, *ofp;
  if (argc != 3) {
    fputs("usage: hoge <in> <out>\n", stderr);
    return 0;
  }
  ifp = fopen(argv[1], "rb"); ofp = fopen(argv[2], "wb");
  if (!ifp || !ofp) {
    perror(NULL);
    return 3;
  }
  while (fgets(s, sizeof(s), ifp)) {
    if (p = strchr(s, '#')) *p = '\0';
    else if (p = strchr(s, '\n')) *p = '\0';
    if (isdigit(*s)) {
      int i = atoi(s);
      fwrite(&i, sizeof(i), 1, ofp);
    }
    else
      fputs(s, ofp);
    fputc('\n', ofp);
  }
  fclose(ofp); fclose(ifp);
  return 0;
}
>>505
32 行までな。
507デフォルトの名無しさん:03/01/29 00:15
どなたか文字列指数をdouble型へ変換する最も効率の良い方法しりませんか?

"3e-5" を 0.00003とする場合など。

お願いします!!
double a;
sscanf("3e-5", "%g", &a)
509507:03/01/29 00:24
>>508
ものすごくあっさりできるのですね。
ちなみに反対の変換はfcvt()でOKでしょうか?
>>509
sprintf()
511507:03/01/29 00:28
>>510
了解しますた。
ありがとうございました。
512504:03/01/29 01:19
>505サソ・・・
ふぉんとにありがdございます。
家に着いたらそこには宝があったよー!!
(゚д゚)ウマー(゚д゚)ウマー(゚д゚)ウマー
とりあえずケコーンしてくだはい。
513504:03/01/29 01:29
あ、当方、29歳女、バツ2です。





・・・などとプロフィールを勝手に書いてみるテスト・・・
514デフォルトの名無しさん:03/01/29 01:35
printfをラップしたいのだが、訳あってvprintfは使えないとき、
int myprintf(const char *format, ...){
 return printf(?????);
}
こんなことは出来ないよねえ。
可変個引数をとる関数とva_listをとる関数はセットで用意しておくべき物なの?
>>514
質問の趣旨がわからないんだけど・・・。
>>513
29じゃ、すでに女じゃないな
>>516
淑女です
518デフォルトの名無しさん:03/01/29 01:47
質問なのですが、
文字をそのままにして計算させることは可能でしょうか?たとえば、
double a=1.2, b=2.3, c, d;
d=a+b+c;
で、“d=3.5+c”と計算させたいのです。
519デフォルトの名無しさん:03/01/29 01:49
誰か教えてください!出来れば、leap=で始まっている2ヶ所を関数にしたいんですが、どうしたらいいでしょう?
そうじゃなくてもこれをもっと短くする方法ってありますかね?

#include <stdio.h>
main()
{
static int days_data[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},Feb=28;
int i,days1,y1,m1,d1,days2,y2,m2,d2,leap,lapse,ydays;
printf("初めの年月日を入力してください : ");
scanf("%d %d %d",&y1,&m1,&d1);
printf("終りの年月日を入力してください : ");
scanf("%d %d %d",&y2,&m2,&d2);
leap=(y1%4==0 && y1%100!=0)|| y1%400==0;
days_data[2]=Feb+leap;
days1=d1;
for(i=1;i<m1;i++){
days1+=days_data[i];
}
leap=(y2%4==0 && y2%100!=0)|| y2%400==0;
days_data[2]=Feb+leap;
days2=d2;
for(i=1;i<m2;i++){
days2+=days_data[i];
}
ydays=0;
for(i=y1;i<y2;i++){
leap=(i%4==0 && i%100!=0)|| i%400==0;
ydays+=365+leap;
}
lapse=(ydays+days2)-days1;
printf("経過日数は%d日です\n",lapse);
}
>>514
printfのラップはなかなか難しい。
ttp://swig-jp.dyndns.org/doc1314-2/Varargs.html
521505:03/01/29 02:06
>>513
一瞬ドキッとしたじゃねえかゴルァ(w
>>519
int isleap(int y1)
{
 return (y1%4==0 && y1%100!=0)|| y1%400==0;
}
523518:03/01/29 03:13
放置??他スレで聞くYO!
>>523
2 時間もしないうちにそれを言うか?
可能か不可能かと言われれば可能だろうけど、自分でインタープリタ作る事になるよ。
>>519
元年1日(西暦)を1日(延べ日数)とした時の
西暦から延べ日数(i)への変換法(y=year,m=month,d=day)
if(++m<4)y--,m+=12;
i=365*y+y/4-y/100+y/400+306*m/10-428+d;
526518:03/01/29 03:34
>524
書きこんだ時点では結構回転早そうだったので・・。
朝までにプログラム作る必要があったので急いでたのでつ。
他スレ逝って来ました。レスサンクスでした。
そろそろテストが始まるのでage
528デフォルトの名無しさん:03/01/29 18:43
ヒロユキ氏ね 俺が、>>1のスレでプロキシー奇声すんな〜
     int
      ┏━━━━━┳━━━━━┳━━━━━┳━━━━━┓
char    ┃           ┃           ┃           ┃           ┃
      ┃     1     ┃     2     ┃     3     ┃     4     ┃
      ┃           ┃           ┃           ┃           ┃
      ┠─────╂━━━━━┻━━━━━┻━━━━━┛
      ┃           ┃
      ┃     2     ┃
      ┃           ┃
      ┃     3     ┃
      ┃           ┃
      ┃     4     ┃
      ┃           ┃
      ┗━━━━━┛
       列*
      ┏━━━━━┳━━━━━┳━━━━━┳━━━━━┓
行**   ┃  [0] [0]  │  [0]  [1]  │  [0] [2]  │  [0] [3]  ┃
      ┠─────┼─────┼─────┼─────┨
       ┃           │           │           │           ┃
      ┠─────┼─────┼─────┼─────┨
       ┃           │           │           │           ┃
      ┠─────┼─────┼─────┼─────┨
       ┃           │           │           │           ┃
      ┗━━━━━┷━━━━━┷━━━━━┷━━━━━┛
 
529デフォルトの名無しさん:03/01/29 18:44
お前のせいでな〜大事なヒトと話できなかったんだYO!
       列*
      ┏━━━━━┳━━━━━┳━━━━━┳━━━━━┓
行**   ┃  [0] [0]  │  [0]  [1]  │  [0] [2]  │  [0] [3]  ┃
      ┠─────┼─────┼─────┼─────┨
       ┃  [1] [0]  │  [1]  [1]  │  [1] [2]  │  [1] [3]  ┃
      ┠─────┼─────┼─────┼─────┨
       ┃  [2] [1]  │  [2]  [1]  │  [2] [2]  │  [2] [3]  ┃
      ┠─────┼─────┼─────┼─────┨
       ┃  [3] [1]  │  [3]  [1]  │  [3] [2]  │  [3] [3]  ┃
      ┗━━━━━┷━━━━━┷━━━━━┷━━━━━┛




       列*
      ┏━━━━━┳━━━━━┳━━━━━┳━━━━━┓
行**   ┃  [0] [0]  │  [0]  [1]  │  [0] [2]  │  [0] [3]  ┃
      ┠─────┼─────┼─────┼─────┨
       ┃  [0] [4]  │  [0]  [5]  │  [0] [6]  │  [0] [7]  ┃
      ┠─────┼─────┼─────┼─────┨
       ┃  [0] [8]  │  [0]  [9]  │ [0] [10] │  [0] [11] ┃
      ┠─────┼─────┼─────┼─────┨
       ┃  [0] [12] │ [0] [13] │ [0] [14] │  [0] [15] ┃
      ┗━━━━━┷━━━━━┷━━━━━┷━━━━━┛

530デフォルトの名無しさん:03/01/29 18:47
 折れが、作ったアスキーアートだ・・・。使ってくれ
1:事実に対して仮定を持ち出す
    「犬は子供を産むが、もし卵を生む犬がいたらどうだろうか?」
2:ごくまれな反例をとりあげる
    「だが、時として尻尾が2本ある犬が生まれることもある」
3:自分に有利な将来像を予想する
    「何年か後、犬に羽が生えないという保証は誰にもできない」
4:主観で決め付ける
    「犬自身が哺乳類であることを望むわけがない」
5:資料を示さず自論が支持されていると思わせる
    「世界では、犬は哺乳類ではないという見方が一般的だ」
6:一見関係ありそうで関係ない話を始める
    「ところで、カモノハシが卵を産むのは知っているか?」
7:陰謀であると力説する
    「それは、犬を哺乳類と認めると都合の良いアメリカが画策した陰謀だ」
8:知能障害を起こす
    「何、犬ごときにマジになってやんの、バーカバーカ」
9:自分の見解を述べずに人格批判をする
    「犬が哺乳類なんて言う奴は、社会に出てない証拠。現実をみてみろよ」
10:ありえない解決策を図る
    「結局、犬が卵を産めるようになれば良いって事だよね」
11:レッテル貼りをする
    「犬が哺乳類だなんて過去の概念にしがみつく右翼はイタイね」
12:決着した話を経緯を無視して蒸し返す
    「ところで、犬がどうやったら哺乳類の条件をみたすんだ?」
13:勝利宣言をする
    「犬が哺乳類だという論はすでに何年も前に論破されてる事なのだが」
14:細かい部分のミスを指摘し相手を無知と認識させる
    「犬って言っても大型犬から小型犬までいる。もっと勉強しろよ」
15:新しい概念が全て正しいのだとミスリードする
    「犬が哺乳類ではないと認めない限り生物学に進歩はない」
16:反論の代わりに詭弁ということにしてすます。
    「それは詭弁です。いいから詭弁なんです。」
532デフォルトの名無しさん:03/01/29 21:17
質問ですが、文字列

"\t\t\tABCD\t\t\t\t1234"

とあって、
char *buf1;
char *buf2;
sscanf("\t\t\tABCD\t\t\t\t1234\t\t","%s%s",buf1,buf2);

とするようなコーディングでbuf1にABCD、buf2に1234と入りますか?
他に簡単に格納する方法がありますか?
533デフォルトの名無しさん:03/01/29 21:21
>>532
> buf2に1234と入りますか?

試してみればわかる。
534533:03/01/29 21:22
sscanfを使う前に、mallocでも使って領域を確保しておけよ。
535532:03/01/29 21:25
>>533
今コンパイラがなく、机上でコーディング考えてるんで…。
お願いします。
536533:03/01/29 21:28
>>535
入るけど、>>534
537532:03/01/29 21:30
>>536
了解しました。
ありがとうございました。
538 ◆vZrORbBkXs :03/01/29 23:04
#include <stdio.h>
main()
{
int y,m;
int c[13],d[13];
long z,n,k,r;
int kara,made,i;
printf("A.D. ");
scanf("%d",&y);
printf("Month ");
scanf("%d",&m);
printf("n");
printf(" SUN");
printf(" MON");
printf(" TUE");
printf(" WED");
printf(" THU");
printf(" FRI");
printf(" SATn");

d[1]=31; d[2]=28; d[3]=31;
d[4]=30; d[5]=31; d[6]=30;
d[7]=31; d[8]=30; d[9]=30;
d[10]=31; d[11]=28; d[12]=31;

539 ◆vZrORbBkXs :03/01/29 23:04
if(((y%4==0)&&(y%100!=0))||(y%400==0))d[2]=29;
c[1]=0;
for(i=1;i<11;++i){
c[i+1]=c[i]+d[i];
}

z=y-1601;
k=z/4 - z/100 + z/400 +1;
n=365*z+k+c[m];
r=n%7;

kara = 1-r;
while(kara<=d[m]){
made=kara+6;
if (made>d[m])
made=d[m];
for (i=kara; i<=made; ++i){
if (i<=0)
printf(" ");
else
printf(" %5d",i);
}
printf("n");
kara+=7;
}
printf("nn");
}

これを修正して欲しいのですが(全部表示されない月があります)
540 ◆vZrORbBkXs :03/01/29 23:09
事故解決しました

× d[10]=31; d[11]=28; d[12]=31;
○ d[10]=31; d[11]=30; d[12]=31;
541デフォルトの名無しさん:03/01/30 00:30
man 2 openでopen関数について調べてみると、同名の関数がふたつ出てくるんですが、
Cでも関数のオーバーロードができるんですか?

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/open.2.html
>>541
Cでは、いわゆるオーバーロードはできません。
これは可変長引数。printfみたいな。
543デフォルトの名無しさん:03/01/30 00:44
>>542
あーなるほど。可変個の引数ですか。
確かにfcntl.hでは三番目は...となっていますね。
flagsによって三番目の引数があるかないか判断しているのかな。

ありがとうございました。
544超初心者の名無し:03/01/30 00:44
超超初心者です。
あるソフトのパッチを当てるのに
バイナリデータの変更で
0000E76A: 56 3b

と書いてあるのですがどういういみですか
>>544
本当に初心者ですね。
聞くべきスレッドを間違えるなんて。

スレ違いどころか板違いか。
546超初心者の名無し:03/01/30 00:56
追記 
別のパッチでは 
004167: 10 00
とADRESS部分が6文字なのですが?
エデッターでどう入れればいいのでしょうか
エデッターって何ですか?
>>546
int main(void) {
FILE *fp;
fp = fopen("hoge", "w+b");
fseek(fp, 0x4167, SEEK_SET);
fwrite("\x10\x00", 2, 1, fp);
fclose(fp);
return 0;
}
30歳代。
会社員だと思っていたが、5万円程度でもう納得したい。
参加するためにはクレジットカード番号を入力したが、男性(約20万円)を購入する。そして、負けだと思っていた。
入金されるゲームということもあり、軽い気持ちでは解約できないし。
インターネット上でギャンブル。
どうすればよいか。
http://www.kokusen.go.jp/jirei/data/200112_3.html
550デフォルトの名無しさん:03/01/30 12:44
可変個の引数を取る関数の中で、与えられた引数の個数以上に読むのはまずいですけど、
少なく読むのはかまわないですよね?
yes
552 :03/01/30 12:50
超怒素人です。
@のexeで取得した変数アドレスを
Aのexeから入力して変数の値を取得したいのですがうまくできません。
何故でしょうか?

@---------------------------------
#include<stdio.h>
int main(void)
{
int a;
long *pnt;
printf("数値を入力して下さい:");
scanf("%d",&a);
pnt = &a;
printf("変数のアドレス:%d\n",pnt);
printf("そのアドレスに格納されている値:%d\n",*pnt);
}
A---------------------------------
#include<stdio.h>
int main(void)
{
int a;
long *pnt;
printf("変数のアドレスを入力して下さい:");
scanf("%d",&a);
pnt = a;
printf("そのアドレスに格納されている値:%d\n",*pnt);
}
ポインタ変数の値が別プロセスで有効な保証は無い、というかまず無効
どうしよう...共有メモリとかの概念とか
物理アドレスと仮想アドレスとかの概念を教えた方がいいのだろうか...
そもそも何がしたいんだろう・・・
556550:03/01/30 13:20
>>551
ありがとうございました。
557デフォルトの名無しさん:03/01/30 13:27
39という文字が書かれたテキストがあって
この場合の"39"って2バイトですよね?
これを1バイトの39にパックしろって
指令されたんですが、
1.パックってなんですか?
2.パックを実現する方法(関数等)
上記2つに関してご教授下さると幸いです。

以上、初心者ですが宜しくお願いします。

>>552って
printf("変数のアドレス:%p\n",pnt);
じゃダメなんすかね?
"39"という文字列を39という値にしろということだと思うけど・・・
atoi、strtol、sscanf

アドレスを手動で入力させるのってかなり無理がある。
559558:03/01/30 13:31
1バイトならsscanfだと面倒か・・・intの変数に入れた後にcharの変数に入れ直さなければならないから。
fscanf(fp, "%2d", &inum);
は、いくらなんでも冗談として、

1の質問は指示した人間にするべきかと。
余りに一般的で汎用的な言葉だけに、
その相手がどんなつもりで「パック」と言ってるかわからん。
#尤も、「おまえそんなこともわからないのか」と言われる覚悟が必要だけど。
Packed BCDにしろって意味ではないかと。
一桁4bitで表現するので、0x39となる。
C言語の標準関数にはないです。

とはいえ、>>560 の言う通り一度確かめた方が確実。
>>561
パック十進数?
二桁なら12bit必要じゃない?
563デフォルトの名無しさん:03/01/30 14:28
ありがとうございました。
564デフォルトの名無しさん:03/01/30 14:58
成績処理プログラムの作り方を教えてください。できれば具体的に
プログラムを書いてくださるとありがたいです。
>>564

#include <stdlib.h>

int main(int argc, char **argv);

void getSeisekiData(void);
void calcHyouka(void);
void putKekka(void);

int
main(int argc, char **argv)
{
getSeisekiData();
calcHyouka();
putKekka();
return EXIT_SUCCESS;
}
/* それぞれの処理をこの後に書けば完成w */
566557:03/01/30 15:09
>>558-562サソ
ご回答ありがdです。
>>563
話しおわらさんといてや

int ENZAN (FILE *fp,char x,char y )
{
char z;
x&=0x0F;
x<<=4;
y&=0x0F;
z=x | y;
fwrite(&z, sizeof(z),1,fp );
}
↑こんな感じの処理をパックって
言うもんだと思ってました・・・
567561:03/01/30 15:09
>>562
もっと詳しく説明してくれ。
昔にも、それBCDちゃうみたいなこといわれて、
調べ直したことがあったんだけど、
結局、どう解釈が違っているのかわからんかったんで。
568564:03/01/30 15:13
>>565
ありがとうございます。
569562:03/01/30 16:14
>>567
二桁で8bit、それに符号4bit、併せて12bit。
違うかな。
>>569=562
1バイトにパックってことだから、符合は考慮しないんでないの?
#寡聞にして、符号付BCDの実例を知らないんだけど。
571デフォルトの名無しさん:03/01/30 20:18
・・すみません、これどうやるのですか?

キーボードをでたらめ出鱈目に打つとき、英字(A-Z, a-z)
、数字(0-9)、その他の文字の出現頻度を数えなさい。
Ex.) I am a student. Hello %Enter → a = 2, d = 1, e = 2

初心者であんまりわからないのですが
/* 取り敢えず、こんなもんでどうでしょ。 */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char**argv);
int
main(int argc, char **argv)
{
int count[256];
int ch;

while (ch = getc() != EOF) {
count[ch]++;
}
/* 問題は出力方法 */
return EXIT_SUCCESS;
}
573デフォルトの名無しさん:03/01/30 20:49
>>572
配列の0での初期化は?
574デフォルトの名無しさん:03/01/30 20:56
GUIアプリケーションをLinuxで開発したいと思うんですが、
どんなライブラリを使えばいいんでしょうか?
どれがお勧めのライブラリなんでしょうか?
>>574
>>1 を読んでないだろ。
>>575
スマソ。別スレに逝きます・・・
577572:03/01/30 21:04
>>573
あ、ぼけてた。
面倒だから
static int count[256];
で。
>>577
出力方法はこんなんでどうでしょ。

for (i = 0; i < 256; i++) {
 if (isprint(i)) {
  printf("%c: %d", i, count[i]);
 }
}
>>578
改行しないと醜いかと。
>>579
おー、忘れてたよ。
>>580
スレ違い。
582580:03/01/30 23:34
ごめん、ちょっと書いてみたくなっただけ。
583デフォルトの名無しさん:03/01/31 00:30
今ユーザー関数作成で困っております。
仕様:テキストファイルを読み込み
行数毎に異なった処理を行い
バッファにぶちこむ。

for(cnt=1; (fgets(tmp,256,ipt_fp)); cnt++)
上記のようにすれば行数は数えることが
可能ですよね?
int cntに代入された数値を利用し
switch (cnt){
case 1:
printf("(゚д゚)ウマー\n");
break;
case 2:
printf("(・A・)イクナイ\n");
break;
といった感じにしたのですが
cntを関数に引数で渡すにはどのように
すればよろしいのでしょうか?
初心者でご迷惑お掛けいたしますが
ご教授お願いいたします。
>>583
関数の定義の仕方がわからんということか?

void uma(int cnt) {
 switch (cnt){
 case 1:
  printf("(゚д゚)ウマー\n");
  break;
 case 2:
  printf("(・A・)イクナイ\n");
  break;
 }
}

とか定義しといて

for(cnt=1; (fgets(tmp,256,ipt_fp)); cnt++) {
 uma(cnt);
}

でいいんじゃないの。それともこういうことじゃない?
 
585583:03/01/31 00:48
>>584さん
ありがとーございます!
なるほど、こうやって定義するんですねぇ。
勉強になります。

cntが1だったら
(゚д゚)ウマーが出力されるのか。
すげー。関数すげー。
関数(゚д゚)ウマー
forを
for(cnt=1; (fgets(tmp,256,ipt_fp)); cnt++)
という形で使えるやつが、

な ん で 関 数 定 義 が わ か ら な い ん だ ? !
>>586
for は極めたが関数定義はまだ習っていないか理解が不十分。
で充分説明つくじゃないか。
>>586-587
BASICからCに入ったので、(自分で定義する)関数というものを知らなかったに100ペリカ
したがって、mainはおまじないで、main以外の関数は一切なし。
しかもgotoを多用したスパゲッティプログラムだ!
589デフォルトの名無しさん:03/01/31 02:02
Cから始めたけど、2000行程度なら関数はmainだけにするYO!
>>589
逝ってよし。
>>590
オマエモナー
>>591
そんな義理なし。
>>592
義理チョコしかもらえないんですか
義理チョコももらえませんが何か?
。・゚・(ノД`)・゚・。
596デフォルトの名無しさん:03/01/31 16:16
int main(){
  //略
  return 0;
}

この最後に返してる0ってなんに使うの?
子プロセスとしてプログラム動かしたら
wait(&state)とかでstateに入る数値になるの?
>>596
そこまで予想がついてるのなら、wait()のmanを見ればすぐ分かるよ。
statusの値そのものじゃなくて、#include <sys/wait.h> で定義されるマクロ
WEXITSTATUS(status) の値がmainの戻り値になる。
598でふぉるとのななしさん:03/01/31 18:40
Cでネットワークプログラミング勉強できるサイト教えてらさい
600デフォルトの名無しさん:03/01/31 18:43
601デフォルトの名無しさん:03/01/31 20:18
>>597
waitとか出てくるのスレ違いちゃうんか?
602デフォルトの名無しさん:03/01/31 20:20
wait持ち出すんならvoid main()でもそれが直接問題になったりせん罠
603デフォルトの名無しさん:03/01/31 21:01
>>596
main()からのリターン値でコマンドが成功したか、どうか判断する!
604デフォルトの名無しさん:03/01/31 21:49
>>596
>この最後に返してる0ってなんに使うの?

結論から言う、それはあんたが決めることだ

さもないとあんたの書いているアプリを使いに来る者
全員に聞いてまわる羽目になる
605デフォルトの名無しさん:03/01/31 21:57
二次元配列p[3][10]のポインタって
*p[3]?*p?
それの先頭を指すポインタなら、(*p)[10]
607デフォルトの名無しさん:03/01/31 22:04
p+1はp[1][0]になる?
>>607
p[1]になる。
609608:03/01/31 22:07
違う違う。*(p+1)がp[1]になる。
610608:03/01/31 22:08
p+1なら&p[1]だ。
611デフォルトの名無しさん:03/01/31 22:10
p[1][1]は何になる?
pの型をTとするならT&だな
613デフォルトの名無しさん:03/01/31 22:56
p+1はp[1]だろ
p[0]+1 は &p[0][1] ?
sizeof(p[0])+p
616int no_name:03/01/31 23:36
いきなりですが、携帯電話(ちなみにJ-phone)で見れる関数リファンレ
ス(というか簡単な文法)のサイトあれば教えてもらえませんか?
617デフォルトの名無しさん:03/02/01 00:12
>>616
カンニング野郎晒しage(W
>>616
携帯電話で開発するのですか?
619int no_name:03/02/01 01:23
>>617
15年前は自分で考えたよ。

>>618
「例のtelnet」てシェルにもアクセスできるの?
man の内容を加工して表示する CGI を作るとか...。
621int no_name:03/02/01 02:03
>>620

深よみしすぎ(苦笑
オレはman読む方が早い。

昔と違って時間がないの!(笑
>>621
プロトタイプだけまとめて自分宛にメールしたら?
623int no_name:03/02/01 02:22
>>622

いいこと言うねェ。

なぜオレがそれをやらないか(笑
これは時間がないわけじゃない。
624デフォルトの名無しさん:03/02/01 06:49
ノノノノ
( ゚∋゚) ハッ!
625デフォルトの名無しさん:03/02/01 14:35
626デフォルトの名無しさん :03/02/01 14:50
http://www.belution.com/miwaki/developer/lsic86.shtml
のインストールのステップ3の方法が分かりません
>>626
無理せずにVisual C++ .NETを買いましょう。
■ Step 3 : autoexec.batの書き換え
これか?
今autoexec.batなんか使わないだろ
2000やxpならシステムのプロパティでPATHを設定する



>>625
左側にある
2482 [e161]char は遅い
のリンク先
解説の
「普通の人の処理時間 370msec」って何?
悪いけど、笑ってしまいました。
>>630
上のプログラムのコメントを見れ。
632デフォルトの名無しさん:03/02/01 20:07
次のようなソースをmain文と一緒に書いてコンパイルして実行すると
「このプログラムは不正な処理を行ったので強制終了されます。」
といじめられます
それともただ単に僕がバカなだけなんでしょうか?
void shell_sort(int *array,int num)
{
int i,j,h;
int val;
num-=1;
for(h=1;h<=num/9;h=3*h+1)
;
for(;h>0;h/=3)
{
for(i=h;i<num;i++)
{
val=array[i];
for(i=i;j>=h&&array[j-h]>val;i-=h)
{
array[j]=array[j-h];
}
array[j]=val;
}
}
}
ご教授願います
>>632
配列の範囲を超えて書き込んでいないか調べる。
634632:03/02/01 20:14
>>633
if(array[num]!=NULL)
{
printf("領域破壊");
array=NULL;
exit(1);
}
みたいなカンジでOKですか?
>>634
arrayの要素はintなのになぜNULLと比較する?
なぜarrayにNULLを代入する?

調べるってのは自分の頭を使って調べるんだ。
636632:03/02/01 20:22
>>635
ごめんなさい
自分の中で「領域外の要素=NULL」だと思っちゃってるんで
もし領域外の要素を使っていたらarrayにNULLを代入して
終了するってつもりだったんですが
確かに今ちゃんと考えれば実引数の内容を変える事に
なっちゃうんだからマズイですよね
拙い点は他にもある。
次の辺りを抑えておくといいと思う。
・領域外かどうかの判断方法
・NULLの型
・コンパイラの警告Lvとその内容
・ソースを客観的に読む
638632:03/02/01 21:06
>>637
それでさっきから気になってたんですけど
NULLって何型なんですか?void型?
常識的なことも分からなくてすみませんです
>>638
(void *)型
>>638
Cだとvoid *にキャストされた0ということが多い。
C++だとキャストなしにvoid *を他の型のポインタに代入できないから単なる0だけど。
NULL をポインタ型以外の文脈で使用した場合、未定義の動作になる。

数値の 0 とポインタ値の 0 (NULL) は別物なので注意。
642632:03/02/01 21:42
(void*)型かぁ
何かの本でvoid*型は何でも代入できる汎用的な型だけど
その分色々問題もあるとか読んだ気がします
でもやっぱりそれを使いこなせてこそプログラマーなんですよね
>>642
別に問題なんかないと思うけど??
使いこなせた上で欠点を言えるのが真のプログラマ。
欠点が言えないのはただの盲目。
>>632
夜釣りは危険
>>642
正確に言うと void * 型は、関数型を除く、あらゆる型への
*ポインタ*を代入できる型。
647632:03/02/01 23:17
>>643->>646
そうなんですかー
確かmallocの戻り値の型はvoid*ですよね
前にキャストしてmallocを使ってるのを見たことあるんですけど
あれは意味があるんですか?

>>647
キャストしないと警告出るから。
>>647
昔はvoidがなかったからmallocの戻り値の型をchar *にしていた。
だからキャストしていたんだけど、今はstdlib.hさえインクルードすれば必要ない。
あと、C++だとキャストが必用だったかな。
>>649
> あと、C++だとキャストが必用だったかな。

その理由は >>640 に書いてあるよ。
>>649
> あと、C++だとキャストが必用だったかな。

つーか、C++ だったら new 使えよ。
652デフォルトの名無しさん:03/02/02 12:06
#include<stdio.h>
って書きますが、stdio.の後のhって何の意味があるんですか?
ググってみても、stdioの意味は解説してあるんですが、.hの意味を解説しているページは見当たりませんでした。

あと、int main()をよく目にしますが
なぜmain()の前にintをつけるのですか?
付ける理由がわかりません。
初歩的な質問とは思いますがよろしくお願いします。
>>652
> stdio.の後のhって何の意味が
stdio.hというファイル名をもつファイルをインクルードしろと言う命令だから

> intをつけるのですか?
intの場合は省略可能だが、わかりやすくするため。
>>652
でもintをつけた場合はreturnしないとダメ
> でもintをつけた場合はreturnしないとダメ
ダウト。
656デフォルトの名無しさん:03/02/02 12:40
C99厨のおでまし。
657655:03/02/02 13:08
ANSI C でもそうなっていますが。
>>657
ハァ?
C++と勘違いしてねーか?
main{}をBCC32(最新版ではない)でコンパイルしたら「関数は値を返すべき」と警告が出たと思ったが・・・・・
>>654-659
[0が返る]ようになったのはC99/C++からだが、
C90でも [ホスト環境へ返る値が未定義] になるだけだろ?
>>652
ただの拡張子。
自作ヘッダならべつに.hである必要は無し。
655 じゃないが、65 はダウトだぞ。
return で値を返すかどうかは、関数の型指定の int を省略したかどうか
とは関係がない。
main() と int main() は結局一緒だろう。
663662:03/02/03 01:53
> 655 じゃないが、65 はダウトだぞ。

65 じゃなくて 654 ね。
まとめると、

・mainの型はintでなければならない。これは規格で決まっている
・mainの型を指定しなかったときはint型を返すと仮定される。
 これは、Cの規約で明示的に返却値を指定しない関数はintを返すと
 仮定されることによる
・いわゆるC99では、mainで値を返さなかった場合(return文やexit関数などを
 経由せずにプログラムが終了した場合)、0を返すことになっている
・C99でない場合、mainはintの値を返さなければならない

これでOK?
漏れにはそれで問題は見つからなかった。
666デフォルトの名無しさん:03/02/03 19:48
引数の文字数を参照する為にその配列のサイズを測りたいのですが、
↓とするとどうもポインタのサイズを測っちゃうみたいでうまくいきません。
どうすれば配列の大きさを測るように出来ますか?
#include<iostream.h>

int main(int argc,char **argv)
{
int x[3];

cout<<"x:"<<sizeof(x)<<endl;
cout<<"argv[1]:"<<sizeof(argv[1])<<endl;
}
>>666
スレ違い。
668デフォルトの名無しさん:03/02/03 20:02
失礼。では気を取り直して…
#include<stdio.h>

int main(int argc,char **argv)
{
int x[3];

cout<<"x:"<<sizeof(x)<<endl;
cout<<"argv[1]:"<<sizeof(argv[1])<<endl;
}
>>668
気を取り直したらC++スレにゆけ。
670669:03/02/03 20:04
つーか文字数を知りたいのならstrlenを使えばいいだろうが。
>669-670
おぉ〜Thanx!
でもどうやればポインタのサイズではなく、配列のサイズを参照できるんでしょう?
672669:03/02/03 20:09
>>671
配列じゃないから無理です。
>>671
ネタですか?
動的に確保したものは測れないのですか?
675デフォルトの名無しさん:03/02/03 20:31
>>671
#include <iostream.h>
#include <string.h> //strlen関数を呼ぶヘッダ

int main()
{
char s[] ="itteyosi";
int len = strlen(s);
cout << s << "の文字数はな " << len << " 個だゴルア!!" << endl;
return 0;
}

てだめなの?
初心者だけど・・・
676デフォルトの名無しさん:03/02/03 20:35
( ´Д`)/<先生!こんなのありました。
http://saitama.gasuki.com/mona/
#include <iostream.h>
#include <string.h> //strlen関数を呼ぶヘッダ

int main()
{
char s[100] ;
cout << "なんか文字入れろや!!ゴルア!!";
cin >> s;
int len = strlen(s);
cout << s << "の文字数はな " << len << " 個だゴルア!!" << endl;
return 0;
}

これ、動的に文字数カウントしてるって言えるの?
初心者だけど
スレ違いだっつってんだよヴォケしね
679583:03/02/03 20:48
>>583で関数作成の質問をさせていただいた
厨房です。
また同じ質問なのですが
for(cnt=1; (fgets(tmp,256,ipt_fp)); cnt++)
でchar tmp[256]にぶち込んだものを
switch文内で使用することになりました。
その際
void uma(int cnt) {
 switch (cnt){
 case 1:
  printf("(゚д゚)ウマー\n");
  break;
 case 2:
  printf("(・A・)イクナイ\n");
  break;
 }
}
上記の処理にどのように引数で渡せばよろしいのでしょうか?
ほんと厨でご迷惑お掛け致しますがよろしくお願い致します。
>>679
まずは無駄なfgetsのまわりのかっこをはずせ。
cntを関数に渡す?関数呼び出し時に引数リストに加えればよいのでは?
681680:03/02/03 20:52
tmpか・・・
void uma(int cnt,char *tmp)
char→intならatoi()
主旨あってるかな?
>char→intならatoi()
(#゚Д゚)ハァ?
684デフォルトの名無しさん:03/02/03 23:33
お世話になります。
IPアドレスを表す文字列を数値に変換する良い方法ありますか?

255.255.255.255 → 0xFFFFFFFF

っていう風に。
unsigned long inet_addr(const char *cp);
unsigned int n = 255;
n += 255 << 8;
n += 255 << 16;
n += 255 << 24;
とか・・・
687684:03/02/03 23:52
>>685
ありがとうございます。
ちなみにその関数はサブネットマスクは駄目なんですかね〜。
…駄目そうですね。。
688684:03/02/04 00:00
>>686
255.255.255.255とは限らないんです。
192.168.0.1なども処理したいので。。

typedef union test{
int addr;
char A[1];
char B[1];
char C[1];
char D[1];
} addr_t;

として、

sscanf("xxx.xxx.xxx.xxx", "%s.%s.%s.%s", addr_t.A,addr_t.B,addr_t.C,addr_t.D);

とするものありですかね〜?
(↑書式怪しいです。)

でも、inet_addrの方が全然スマートですね。
typedef union ip {
int addr;
char bytes[4];
} addr_t;

addr_t foo;
sscanf("192.168.0.1", "%d.%d.%d.%d", &foo.bytes[0], &foo.bytes[1], &foo.bytes[2], &foo.bytes[3]);
printf("%x\n", foo.addr);
/* 不毛だ・・ */
690デフォルトの名無しさん:03/02/04 01:08
>>689
%dにchar *を与えちゃダメ!!
691デフォルトの名無しさん:03/02/04 01:23
>>689
%pを使ってください。おながいします。
692デフォルトの名無しさん:03/02/04 01:25
>>688
http://www.asahi-net.or.jp/%7EVZ4H-SRUZ/ipmsg.html
に配布されてるソース眺めるとヒントあんるかも・・・
へぇ、埼玉県の中に東京都練馬区の一部があるんだ。
694デフォルトの名無しさん:03/02/04 02:11
C言語を勉強するのに分かり易い参考書ってありますか?
たくさん本があるから、どれがいいのかわからなくて。
自分はPASCALを少し使えるくらいです。
あと、パソコンの専門用語もあまりわかりません。

よろしくお願いします。
>>694
まなタンのやさしいC
696694:03/02/04 02:19
>>695
ありがとうございます。

今度書店で探してみます。
>>694

>>1を読めないのか?
698デフォルトの名無しさん:03/02/04 11:05
>>693
どこの誤爆だ?

・・・が、その近隣の住人なんで気になった。
4〜5軒の家だけ飛び地になってるんだよ。
699679:03/02/04 11:23
>>680サソ
ご回答ありがdございますた!
謝謝
>>698
テレビ番組板だね。昨日の「トリビアの泉」でやってた。
しかしなんでム板に誤爆…。
701デフォルトの名無しさん:03/02/04 11:31
int i;
int *p;

i=*p++;

これは、
i=*(p++);
ですか?
>>701
試してみればわかるでしょ。
pが指すものをiに代入し、pの値を1ふやす。
>>701
そう。
リファレンス見ればわかるはずだけど、無いの?
プリプロセッサもCの範疇だよね??
>>704
C という言語の一部ではないけど、C という処理系の一部ではある。
>>705
なるほど・・・
なんか他の言語にも流用できるとか・・・
>>706
アセンブラに流用するのが割りと見かけるようとかな。
後は、ソース解析系のツールも利用している。
708デフォルトの名無しさん:03/02/04 12:04
struct hoge {
char ahya[16];
} PIYO;

こんな構造体があって
ポインタから要素にアクセスするときは
PIYO->ahyaになりますよね?
この要素に文字列をぶちこみたいのですが
どのようにすればよろしいのでしょうか?
御教授ください。
よろしくお願い致します。
strcpy(PIYO->ahya, "適当な文字列"); /* 但し文字列の長さに注意 */
sprintf(PIYO->ahya, "%.15s", "応用が利く方法");

間違っても、strncpy()を使ったり自前で一文字ずつコピーしないように。
710709:03/02/04 12:11
って、書いてから気付いた。
PIYOはポインタ変数じゃないじゃないか。
なので一応フォロー。

struct hoge *pPiyo;

pPiyo = &PIYO;
strcpy(pPiyo->ahya, "後は応用しる");
PIYO.ahya[0]='h';PIYO.ahya[1]='o';PIYO.ahya[2]='g';PIYO.ahya[3]='e';PIYO.ahya[4]=0;
strcpy((&PIYO)->ahya, "後は応用しる");
713709:03/02/04 12:26
char *p = &PIYO.ahya;
strcpy(p, "後は応用しる");
714708:03/02/04 14:21
>>709-713
ミナサーン
アリガd
オマイラサイコーダZE!
715デフォルトの名無しさん:03/02/04 16:26
C言語ものすごい勢いで勉強しています。
ちょっとどうしても並列が苦手でわからないんでご教授ください
int x, ary[3];

for(x = 0; x < 3; x++) {
ary[x] = 10 * x;
printf("%d\n", ary[x]);

ってのがあったとします 「ary[x] = 10 * x;」のことなんですが
x==2としたら20がary[x]のxに代入されますよね?
その代入されたxってのはaryの要素番号じゃないんですか?
プログラムを見ると、xは要素そのものを指してるようなんですが
そこのところが全然意味わからないのです。。。
>>715の日本語がわからん
717デフォルトの名無しさん:03/02/04 16:30
>>716 すんません意味不明で
つまりary[x] = 10 * x; だとary[x]のxは要素番号じゃないの? ってことなんです
'配列'な
CPUの並列処理じゃないんだから。

x==2としたら'2'がary[x]のxに入る、と思うが。
結果としてxは、要素番号だと思うが。
10*xが要素そのものか?
いや、やっぱわからん。
20が代入されているのはary[x]であってxではないぞよ?
720715:03/02/04 16:42
そそ「配列」でした(w
実はこれまで割とすんなり勉強できてたんですが、配列がどうも納得いかないのです

「20が代入されているのはary[x]であってxではないぞよ?」ってのがどうもわかんないす
ary[x]は変数のようなものなのでしょうか? 例えば int a = 5; みたいな
それなら納得いくんですがなんか違うような・・・ほんとスマソ こんな質問しちゃって
721デフォルトの名無しさん:03/02/04 16:44
何で今のゲーム業界はC++が使われてないの?
>>720 処理結果より、アドレス:値:Cの定義した変数の名前
08047a94:00:any[0]
08047a98:0a:any[1]
08047a9c:14:any[2]
08047aa0:03:x
>>720
配列は入れ物
アパートとかホテルの部屋のようなものを想像すればいい
>>721
どういう言語が主流?
725715:03/02/04 16:49
正直まだわかんないですけど、何人かの人が答えてくれたものを理解できるようがんがります
なんかお邪魔してすいませんでした みんなありがとうヽ(´ー`)ノ
int x;のイメージ
┌─┐
│ │x
└─┘
int ary[3];のイメージ
┌─┬─┬─┐
│ │ │ │ary
└─┴─┴─┘

x = 2、ary[x] = 20のとき、
┌─┐
│ 2│x
└─┘
┌─┬─┬─┐
│ │20│ │ary
└─┴─┴─┘

等幅な環境にコピペすれば判るっしょ。
> x==2としたら20がary[x]のxに代入されますよね?
x==2としたらary[2](ary[x])に20が代入される。

> その代入されたxってのはaryの要素番号じゃないんですか?
あくまで代入されたのはary[2]。xはaryの要素番号は正しい。

> プログラムを見ると、xは要素そのものを指してるようなんですが
纏めると、ary=配列, ary[x]=配列の要素, x=配列の要素番号
728715:03/02/04 16:57
・・・みんななんていいヤツなんだ! これで完全に時間かけたら理解できそうっす!
ほんと感謝、感謝です 今ほんとに本気でCを勉強してるんだけど、すごくおもろいですね〜
早くC++とかできるようにがんがります  ほんとありがとうね!
729デフォルトの名無しさん:03/02/04 17:45
bcc32でAPI関数ShellExcuteをしたいのですがコンパイルエラーになります。
shellapi.hをインクルードして
bcc32 -W ソースファイル.c でコンパイルしてるのに、何故ですか?
>>729
リンクエラーでしょ?
必用なライブラリをリンクするようにリンカーに伝えればよい。
方法はスレ違いなので、Borlandフリーコンパイラスレできいてね。
>>729
エラーの内容を書かないのに診断できると思うのか?
732708:03/02/04 19:41
>>708デシ

ミナサソの御教授を元に
下記のようにやってみますた。
void OrehaAfo (int i,char *s, struct uma *ahya){

char hoge[512];
char dmy[512];

switch ( i ) {
case 1:
sscanf( s, "%x #%s", &hoge, &dmy );
strcpy(ahya->priority, hoge) ;
printf("buf NO.1=%s\n",&CMQ->priority);
break;
case 2:

ってな具合にしたんですが,コンパイル時に
警告: ポインタ/整数の組み合わせは不適切です: 1 番目の引数
という警告がでてしまいます。。。
わからんっす、わからんっす。
異常な点をご指摘していただけるとありがたいのです。
異常なのはオマエの脳内とか勘弁してください。
よろしくおながいします。
>>732
sscanf( s, "%x #%s", &hoge, &dmy );の&dmyとprintf("buf NO.1=%s\n",&CMQ->priority);の&CMQ->priorityの&は不要でしょ?
あと、配列名に&をつけてはだめ(&hoge)。sscanfの%xにはint *を与えること。
734733:03/02/04 20:33
・・・・。配列名に&をつけてもいいのか。。。
735733:03/02/04 20:34
char (*)[512]になるんだから当たり前か(^_^;)
736デフォルトの名無しさん:03/02/04 21:32
'\0' を含んだ文字列を標準入力から読む時

char buf[10000] = {0};
char *p = buf;
int ret;

while (ret = read(0, p, 100) > 0) {
p += ret;
}

これで合ってますか?
>buf[10000] = {0};
無駄無駄無駄あぁぁッ
738デフォルトの名無しさん:03/02/04 21:42
ついくせで...
でも、それ以外は間違いないですか?
buffer overrunするのを間違いに入れないならば。
問題外
overflow?
freadで10000バイト読むというやりかたじゃダメなのか?
ありがとうございました
うまく動きそうです
落第
>>736
stringstream ss;
ss << cin.rdbuf();
が正解
逝ってよし
747732:03/02/04 22:22
わかりにくい質問でしたので再度質問させていただきます
struct hoge{
int t;/* ヘキサでぶち込む用 */
char s;/* ヘキサでぶち込む用 */
char ss[16];/* 文字列用 */};
上記のような構造体がありまして
void MajiWakaran (int i,char *s, struct hoge *piyo){
char hoge[512,odamy[512];

switch ( i ) {
case 1:
sscanf( s, "%x #%s", &hoge, &odamy );
strcpy(&piyo->t, hoge) ;
printf("int t = %s\n",&piyo->t); break;
case 2:
sscanf( s, "%x #%s", &hoge, &odamy );
strcpy(&piyo->s, hoge) ;
printf("char s = %s\n",&piyo->s);break;
case 3:
sscanf( s, "%x #%s", &hoge, &odamy );
strcpy(piyo->ss, hoge) ;
printf("char ss = %s\n",&piyo->ss);break;
上記のような関数があります。
printfした結果、int tとchar sが空白になってしまいます。
この関数は
for( CNT=1; fgets(dmy2,256,ifp) !=NULL; CNT++){
Fhk_ipTRSF(CNT,dmy2,&piyo);}
↑のような使用法でmain関数内に配置しております。
int tとchar sが空白になってしまう原因を御教授いただけると幸いです。
お願い致します。
748747:03/02/04 22:24
続き

ファイルから読みこんだバッファは
void MajiWakaran (int i,char *s, struct hoge *piyo){
のchar sに格納されているはずでして、
int tには"0F680000"
char sには"01"が入っております。
749デフォルトの名無しさん:03/02/04 22:29
>>747
printf("int t = %d\n",piyo->t); break;
printf("char s = %s\n",piyo->s);break;

strcpy?
>>734
配列変数をポインタとして評価した時、& があるか無いかでは型が違うから気をつけろ!
752デフォルトの名無しさん:03/02/05 02:32
freopen("c:\\stdout.txt", "w", stdout);

のようにして標準出力をファイル出力に変えたのだが、
もとのコンソール出力に戻にはどうすればいいの?
753752:03/02/05 02:42
解決した。
freopen("/dev/console", "w", stdout);
freopen("CON", "w", stdout);
のように直接指定しなければならないのね。
754デフォルトの名無しさん:03/02/05 03:17
「XXだったら非0,XXでなかったら0を返す」という関数を幾つか作って、
int a = isXXX();
a &= isYYY();
とお馬鹿なコードを書いていたらバグりました。
1行目が1を、2行目が2を返していたからです。
「isXXX()かつisYYY()でaは非0」のつもりが、(1&2)、そう、0ですた。

↑これに対する修正をしていて、ふと思ったこと。

(2&&4)

が返す値は、1?2?4?
1(真)
756デフォルトの名無しさん:03/02/05 03:38
配列に文字列をいれて、その文字の文字コードを調べるときには
一度別の変数に入れて調べるしかないのでしょうか?

str[0]の文字コードを調べる時には

char str[] = "ABC";
char buf;

buf = str[0];
printf("%d",buf);

別の変数に入れずにスマートに行きたいのですけど
この方法以外でないのでしょうか


printf("%d", str[0]);
758デフォルトの名無しさん:03/02/05 03:52
夜釣り禁止!
759デフォルトの名無しさん:03/02/05 03:58

質問です。
array1[N]に対して何らかの処理(ソートなど)を行い、
array2[N]、array3[N]・・・と名前の違う配列にまったく同じ処理を
行う場合に、同じ処理を繰り返し書かないようにしたいです。
ポインタを使って解決するにはどうすればよいでしょうか。
array1,array2,...へのポインタからなる配列をつくってループ
761デフォルトの名無しさん:03/02/05 04:06
>>759
いっそ、2次元で配列を確保して
forループのなかで array[i][j]で行う
>>760
int *array[M] = {array1, array2, array3, ・・・};

という感じでいいですか?
763デフォルトの名無しさん:03/02/05 07:50
FILE *fp
fp = fopen( C:\\WINDOWS\\DATA.txt, "a+" );

a+モードで開いた既存の(既にデータが入っている)テキストファイルに、
ファイルの先頭から新たに(全てのデータを消して)書き込みたいのですが
どうもうまくいきません。(rewindとかfseekとかやってみましたが )

既に入っているデータを使用して計算し結果を同じファイルに出力するため
a+モードでやらなければなりません。
スマートなやりかたはないでしょうか。
#define numberof(x) (sizeof(x)/sizeof(*(x)))

int *arrays[] = {array1, array2, array3,};
int ic;
for (ic = 0; ic < numberof(arrays); ic++) {
 nanrakanoshori(arrays[ic]);
}

定数Mはやめとけ。
>>763
"a"や"a+"は「追加」のためのモードなのでファイルの先頭には行けない。
既存のファイルの先頭にもアクセスしたいなら"r+"で開いて自分でfseek()すればいい。
766747:03/02/05 11:02
>>749サソ
ご回答アリガdございます。
ご指摘くださった方法で
コンパイルは通るのですが
実行しますと
core dump吐きます。。。
セグメント例外(コアダンプ)と・・・
int t は表示されるのですが
(でも、"0"がかえってくる・・・)
char sは表示されないので
char sに問題があるようなのですが
わかりません。。。
再度でもうしわけございませんが
御教授お願い致します。
>>766
>>733は無視かい?
>>766=747
ツッコミどころ満載で何処から手をつけていいやらなんだけど、
sscanf()の第3パラメータは激しく間違い。
#sscnaf()とprintf()、構造体の使い方をそれぞれきっちり理解してから組み合わせよう。
769766:03/02/05 11:28
>>767-768サソ
ご指摘ありがとうございます。
void OrehaAfo (int i,char *s, struct uma *piyo){

char hoge[512];
char dmy[512];

switch ( i ) {
case 1:
sscanf( s, "%x #%s", hoge, dmy );
strcpy(piyo->t, hoge) ;
printf("buf NO.1=%s\n",piyo->t;
break;
case 2:
sscanf( s, "%x #%s", hoge, &odamy );
strcpy(piyo->s, hoge) ;
printf("char s = %s\n",piyo->s);
break;
というような具合に修正したのですが
同じ結果です。
sscanf()の第3引数が腐ってるとのことですが、、、
正直ど厨初心者でよーわかっておりません、、、
ご指導 き ぼ ん ぬ 、、、
ごめん、第3パラメータそのものじゃないや、第3パラメータに渡しているhoge周りが滅茶苦茶。
(1)"%x"の意味は判る?
判ってないならごちゃごちゃ修正せずにsscanf()だけのサンプルつくって納得いくまでやってみな。
(2)intへstrcpy()しようとしているけどこれも判ってないっしょ。
判ってないなら(以下同文)。
(3)承知してやってるなら別だけど、構造体のタグと同じ名前の変数は定義するな。

兎に角いっぺんにやろうったって無理だって。
Error: >>747/>>769 printf系の%d%l%f%・・書式が理解できていません
Error: >>747/>>769 int,char,char[],*char などのデータ型が理解できていません
Worning: >>747/>>769 ポインタと実体が理解できていません

間違いの有無を別として、ソースを見ても仕様が理解できないのはめずらしいのだが
とりあえず、scanfに与える引数には&をつける必用があると思いこむのはやめよう。
>>771
708から延々と見ていくと少しは判るかも。<仕様
#漏れは判らなかったから任せた。w
774デフォルトの名無しさん:03/02/05 12:56
インテルのコンパイラがほしいです。
775デフォルトの名無しさん:03/02/05 13:23
そっか
>>775
Winnyでひっかからないんですけど(T_T)
セブ〜〜ンセブ〜〜ンセブ〜〜〜〜ン セブンセブンセブン
インテルってコンパイラ出してたっけ?
779769:03/02/05 16:15
>>770-773
各位
ご指摘ありがとうございます。
がんばってみまふ
>>778
VTune買うと付いてたと思ふ
クソレス申し訳ないが・・・

C言語ってC++のことですか?
__________________
↓餌
↓釣り針
784釣り針:03/02/05 17:28
ある関数の仮引数がポインタ変数のポインタ変数であり、
2次元配列をその関数の引数として渡したい場合、
その関数を呼び出す側は、どのように実引数を渡せばよいのでしょうか?
(ただし、関数の仮引数がポインタ変数のポインタ変数であることは
変更不可、という条件があります)

#include <stdio.h>
void mess(int **p);
int main(void){
int i, j;
int **p[2][2], *p2[2][2], p3[2][2];
for(i=0; i<=1; i++){
for(j=0;j<=1;j++){
p2[i][j] = &p3[i][j];
p[i][j] = &p2[i][j];
**p[i][j] = i*j;
printf("%d\n", **p[i][j]); /* 値は正しく入っている */
}}
printf("\n");
mess(*p); /* ここはどうすれば? */
return 0;
}

void mess(int **p) /* 問題上、定義側がポインタのポインタであることは変更不可 */
{
int i, j;
for(i=0; i<=1; i++){
for(j=0;j<=1;j++){
printf("%d\n", p[i][j]);
}}}
785釣り針:03/02/05 18:36
うぅ…死にます。死んで来ます…
786デフォルトの名無しさん:03/02/05 18:49
**str
*str[]
str[][]
これらのいずれも同じように感じるのですが、どうなのでしょうか?
Now preparing the installation...
788763 >>765ありがとうございます。:03/02/06 00:14
FILE *fp
fp = fopen( "C:\\WINDOWS\\DATA.txt", "?????" );

ううう、>>763で既存のファイルを開くと書きましたが、
ファイルがない場合は新しくファイルを生成する必要がでてきました。
ファイルがある場合は書き込まれているデータを使用して計算し結果を同じファイルに出力します。
fopen( "C:\\WINDOWS\\DATA.txt", "rw+" );
↑だとDATA.txtがない場合はファイルを新しく作ってくれるのでいいのですが、
DATA.txtがある場合はファイルを壊して新しく作ってしまうので使えません。

また、ファイルの先頭からデータを書き込むので"a+"や"a"は使用できません。
つーか、ファイルがあるかないか調べてある場合とない場合でfopenのデリミタの指定を変える必要がある?
それだとスマートじゃないような。。。

よろしくお願いします。
>>788
WindowsならCreateFile使えばいいじゃん。
パラメータは自分で調べろ。
790デフォルトの名無しさん:03/02/06 00:48
浮動小数点演算例外ってなにですか?
0で割るとかそういう類のものなのでしょうか?
791デフォルトの名無しさん:03/02/06 00:48
暇なお方!このサイトをガンガン荒らしてください!
変態がイパーイいるサイトでつ!ヨロシク!!

http://homepage2.nifty.com/tikan/
>>790
yes.
但し処理系依存。
例外出さずにInfやNaN返すような処理系も有る。
>792
おぉ、有難う!
>>792
その書き方も処理系依存だから、無限大値 (Infinite) とか非数値(Not a number)
とか書いた方が。
>>786
それらが同じ意味を持つのは関数の引数で現れたときだけだ。
変数の宣言(定義も含む)を行ったときはその三つは全然違う意味になる。
796en252.ade.ttcn.ne.jp:03/02/06 01:55
関数がかなりややこしくなって丸ごときれいに書き直したモジュールに
変えたいんだけども以前の関数と同じ動作をするかどうかを
全パスチェックするのは大変なので、この際処理時間は無視していいから
ロジックとして同じ動作をすることを証明してくれる
ソフトってないでしょうか?
797デフォルトの名無しさん:03/02/06 01:58
>>786
**str ポインタのポインタ
*str[] ポインタの配列
str[][] 二次元配列

ポインタはアドレスを保管しておく変数である。
例えば配列の先頭アドレスを保管しておいて、
配列の様に使うことができる。
その場合、配列の置いてある場所と
ポインタの置いてある場所は別であることは
十分注意しなければならない。

配列にはそのようにアドレスを保管しておく場所は存在しない。
従って、メモリ上に置かれるのは
配列そのもののみである。

これらのことを考慮に入れて、
それぞれメモリ上にどう置かれているか、
紙の上に書いてみよう。
798795:03/02/06 02:04
>>797
補足ありがとさん。不親切な書き方だなと反省してた(w
んで、>>797は変数の宣言・定義の時のことな。
関数の宣言の引数に現れたときは三つとも同じ**pと見なされる。
>>796
どういう状態であれば 「同じ」 と判断できるのか、条件を言ってみてくれ。
>>796
アルゴリズムの自動証明ソフトなら作れば大金持ちになれそうだな
実際に全ての入力についてチェックするのは実質的に無理だな、
内部状態があるとなお大変だ。自分で証明するしかないだろ
>>796
両モジュールに適当にいろいろなデータぶち込んで、
出力値が同じになるかどうかを確かめるというのはだめかの…?
>>801
その労力を惜しんでいるものと思われ
803デフォルトの名無しさん:03/02/06 07:06
内部状態は時々グローバル変数にコピーして確かめる。
804763 >:03/02/06 07:30
>>789
ありがとうございます。
調べてみます。
805デフォルトの名無しさん:03/02/06 12:31
>>798
違いますよ。
関数の引数では
 **p ポインタへのポインタ
 (*p)[N] 配列へのポインタ
 *p[N] ポインタへのポインタ(Cでは本当は無理だったはず)
 p[M][N] 配列へのポインタ(Cでは本当は無理だったはず)
となります。

こういった違いは二次元配列をソートする関数を
作る時とかに重要になります。
ポインタって具体的にどんな時に使えるのですか?
構造体リストとか構造木には使えると分かるのですが
>>806
不要だと思うなら使うべきではない。
でも、文字列操作とかにはよく使うし、動的メモリ確保をするならポインタに
頼らざるを得ない。
808806:03/02/06 14:51
>>807
そういえば確かにmallocとかは対象がポインタじゃないとダメですよね
も1つ質問なのですが変数宣言で
char array[]="iteyo-shi";
と宣言したとします
これをポインタを使って宣言すると
char *array="iteyo-shi";
でいいんですか?
違うような気はするのですが厨房なので違いが分かりません
ご教授お願いします
809デフォルトの名無しさん:03/02/06 14:55
Direct3D のサンプルで FLOAT x = (FLOAT)sin(....); というのを
よく見かけるのですが、上記のようなケースで sin() の戻り値を
明示的に FLOAT型へキャストする必要はあるのでしょうか。ちなみに
typedef float FLOAT; となっているようです。
810ミ,,゚Д゚彡:03/02/06 15:07
>>808
http://www.catnet.ne.jp/kouno/c_faq/c6.html

>>809
普通、sin の戻り値は double だと思うのだが。
811809:03/02/06 15:11
>>810
いえ double から float へは暗黙に型変換が行われるのじゃ
ないかと思ったので。浮動小数点型のキャストに付いて理解が
足りない部分があったのだろうかと
>>811=809
明示的に書いておきたいだけじゃないの?
そもそもfloat使う段階で普通じゃないから理由がわかんないけど。
>>809
floatはDirect3Dのハードウェアとの整合性うんぬんの話では
C++コンパイラは型キャストに厳しい
C++?
>>809
lintを黙らせる為にそういうことをすることはある。
816809:03/02/06 18:27
みなさんどうもです
特に意味があるキャストではなさそうなので安心しました。
C# では double → float でキャストが必要みたいなので
混乱しそうですね。
C#?
まだCをやり始めて一ヶ月ほどなんですが、オリジナルのライブラリを使いたいのに、標準のライブラリが適用されてしまいます。
どこか弄らないといけないのでしょうか?
環境はCygwinです。
使いたい関数を、標準ライブラリに含まれているものと名前を変える。
それができないならライブラリを評価する順序を変えるしか。
820デフォルトの名無しさん:03/02/06 21:31
>808
char array[]="iteyo-shi";
char *array="iteyo-shi";

実体が何処におかれるか?だな。

array[]="iteyo-shi";
こっちは実体。
んで、
char *array="iteyo-shi";
こっちはcharのポインタがさすどっかのアドレスに
"iteyo-shi"を代入してるつう事では?
危なくねぇ?それって。
俺も糞厨房なんだけど。
>>820
> こっちはcharのポインタがさすどっかのアドレスに
> "iteyo-shi"を代入してるつう事では?

アフォ。"iteyo-shi" が書いてあるどっかのアドレスを array に代入してんるんだ。
危なくはない。
ただし、*array = 'I'; とかした時の挙動は異なる。(ことがある)

char array[] = "iteyo-shi"; ならちゃんと "Iteyo-shi" になる。
char *array = "iteyo-shi"; だと何が起こっても不思議ではない。
>808
後者は文字列リテラル定数のアドレス。
参照するだけで、そこの実態を書き換えなければ問題無し。
こういうコードは有りですか?

char *array = {"itte", "yosi", "kana"};
実際に試せばいいのに。
>>823
char *array[3] = {"itte", "yosi", "kana"};
>>823
何を目的としたコードなんだ?
827823:03/02/06 22:33
>>825
すんまへん。そういうつもりでした。
で、>>825ならOKで?

疑問なのは、文字列リテラルの寿命ってどうなってるのかなっつーことでし。
なんとなく、普通の変数(>>825のarrayなんか)より寿命が長そうなので、
いいかなと思ったんけど、あんまりそういうコード見ないし、疑問なんです。
プログラム開始からプログラム終了まで。
静的変数と同じ。
829823:03/02/06 22:40
>>828
わかりました。>>825なら問題なしですね。
ありがとうございました。
(でも、疑うのではないのですが、そういうことって、
どの辺を勉強すればわかるんですか?)
>>821

char a[] = "itteyo-shi";
char *p = "itteyo-shi";

後者で何が起こっても不思議じゃないなんてこたない。
どっちも規格に合致してる書式だし、実際に問題の起こる処理系は見たことない。

aはaというラベルのついてる11バイトの領域に文字列「itte-yoshi\0」が入ってる。
 a |i|t|t|e|-|y|o|s|h|i|\0|

pはpというラベルのついてる領域に、どっかにある「itte-yoshi\0」という文字列
の先頭を指す値(ポインタ)が入っている。
 p |ポインタ| → |i|t|t|e|-|y|o|s|h|i|\0|

斯様にポインタと配列はまったくの別物であるが、Cの場合大抵の場面で
ポインタと配列は同じように扱えるってだけの話。

ただし、pのように初期化したときに取られる文字列の領域を書き換えてはいけないと
規格では書かれている。
もし書き換えたら、(この場合に限り)何が起こっても不思議じゃない。
>>830
多分>>821の内容を誤解してる
>>829
ちょっと古い本だが、「エキスパートCプログラミング」がお勧め。
http://www.ascii.co.jp/books/detail/4-7561/4-7561-1639-6.html
というか、Cでプログラム書くやつは必読書だとさえ思う。
>>830
まさにそのことを821は言ってるんだと思うのだけど。
835829:03/02/06 22:54
>>831 >>833
サンキューです。勉強します。
>>834
おお、そうかそうか、読みきれてなかった。
アフォですた、すんません。
ちょっと細かい話をさせてもらうと、本当は、

>ポインタと配列はまったくの別物であるが、Cの場合大抵の場面で
>ポインタと配列は同じように扱える

というのはまちがいで、

 1.Cにはポインタはあるが配列はない
 2.*(p+n)のシンタックスシュガーとしてp[n]がある

という方がすっきりしてると思うんだけど。で、

char a[] = "itteyo-shi";
char *p = "itteyo-shi";

では、aもpもポインタ。
ただ、どこに文字列データが確保されるかの違い、という説明。
どうすか?
>>837
だめ。大域変数で

char a[] = "itteyo-shi";
char *p = "itteyo-shi";

なんて定義があったとして、別のファイルで

extern char *a;
extern char p[];

なんてやったらどうなる?
aは配列だよ。&演算子やsizeof演算子のオペランドになる場合だけ
ポインタ(配列の先頭要素を指す)に成り下がる。
840839:03/02/06 23:10
失礼・・・
>場合だけ
場合の除いて
841837:03/02/06 23:19
>>838
えーと。a[]と*aが互換というつもりはありませんのでした。
「aもpもポインタである」というだけで、aが「変数」かどうかは別です。

>>839
まあ、そういう見方もわかりますが、たとえば、
"abcd"[2]
なんかでは、ポインタが配列に成り上がるのでしょうか?

個人的には、言葉の定義は、多数の意見が「正解」なんだと思うので、
自分が正しいというつもりはないんですけど。
842806:03/02/06 23:27
かなりレス遅れましたが806です
何かの本で文字列リテラルは配列だと読んだことがあるのですが
要するに
char *p="iteyo-shi";

char array[]="iteyo-shi";
char *p=array;
と同じだってことですよね?
char a[]="itteyoshi";
char *p ="itteyoshi";

上のをauto変数でやると、毎回コピーされるから、かなり遅くない?
>>842
フザケンナ!!
>>841
配列名は配列の最初の要素のアドレスを指すが
ポインタではないのでインクリメントできない
846デフォルトの名無しさん:03/02/06 23:37
エンディアンで質問なのですが、
なるべくコード上で#ifdefとか使ってエンディアンを区別せずに
makefileかヘッダでどの処理でもビッグエンディアンにする方法がありましたら
ご教示下さい。
>>841
いや、多数の意見が正解じゃなくて規格に書いてあることが正解。
規格そのものは(多分)多数決で決まってるんだと思うけどね。
char a[] = "itteyoshi";
の場合、どちらも非constなので問題なし。
char *p = "itteyoshi";
の場合、右辺はconstなのでconstへのポインタから非constへのポインタの代入なので警告対象。
勿論、
char const *p = "itteyoshi";
ならば、どちらもconstなので問題なし。
但し、
p[0] = 'I';
とすると、その時点でエラーになるはず。

>>843
前者は文字列のコピーが発生するが、後者はポインタのみの代入。
あとあとのことを考えたらきっちり配列とポインタは区別しておいた
ほうがいいと思うな。文字列リテラルを書き換えようとしたり。a が
ポインタなら a = p; が許されないのはどうしてか、とか。sizeofの
結果も。あとで混乱の元になりそう。
850837:03/02/06 23:40
>>845
なるほど。インクリメントできないものをポインタとはよべない。
うー、説得力あります。

それと、>>839をよく考えたんすけど、
sizeofの挙動は、ポインタだけでは説明できない、かな?
sizeofは、どうやって配列の終わりを知るんでしょう?

なんか、負けたような気がします。
もう、みんな必ず一回は配列とポインタで混乱するから、Cから配列をなくそうよ。

int a[10];
は、
int *a = alloa(...);
と等価としたらいいやん。
>>846
ないんじゃないかな。

エンディアンを気にする部分を関数群に閉じ込めちゃって
他ではエンディアンを気にせずコーディングするってのが
定石でしょう。でもそれが使えないってことなのかな…
たとえば「#ifdef使っちゃだめ」ってアフォな規則あるとか。
>>850
配列のサイズはコンパイル時にわかってるから、
sizeof(配列)なんてのがあったらコンパイラは
配列のサイズに置き換えるだけの話。
syslogシステムコールで質問。
openlogして設定して、syslogを実行します。
closelogせずにopenlogを再度実行して、
syslogを行い、closelogすると、
設定は最初のopenlogに戻る?

どうすれば戻るようなコーディングできる?

>>851
 >>850の言うようにsizeofはどうするんだ?
856846:03/02/06 23:46
>>852
即レスサンクス。
やはり無いですか。。
今からエンディアンを変更せよと言われ、面倒だったので。。
857850:03/02/06 23:49
>>853
なるほどです。
でも、そうすると、sizeofそのものがちょっと「いんちき」みたいな。
でも、そんなこと言うと、デンパですかね。

>>848は、いろいろおもしろいものを含んでいるような気がしますが、
眠いので落ちます。
858806:03/02/07 00:07
a[1]ってのはもともと*(a+1)のシンタックスシュガーだから
型のサイズ×配列のインデックスでアドレスがその分だけ進められるんですよね?
例えばsizeof(char)=1の環境で
char a[]="iteyo-shi";という宣言があったとして
&a[0]=0x0000000だったとすると&a[1]=0x0000001になるはずだから
sizeof(char)*1=1で0x0000000に1がプラスされて0x0000001になって
そのアドレスにオペランドとしてアスタリクをつけて
変数の内容を参照するわけですね?
長い&分かりにくくてスマソ
>>858
その理解であってると思うぞ。
860デフォルトの名無しさん:03/02/07 00:21
char a[] = "itte-yoshi!";
これは、a という配列を確保し、
それを "itte-yoshi!" で初期化するというもの。

char *p = "itte-yoshi!";
これは、"itte-yoshi!" という文字列リテラルのアドレスで
p を初期化するというもの。

文字列リテラルがどこに確保されるかはOSによって違うが、
多分静的であることは保証されてると思ってていいんじゃないかな。
あと、OSによっては書き換えを禁止されている領域に確保されるから、
*p = 'I'; なんてことをすると、書き換えちゃダメ! ってエラーが出ることがある。
OS依存だから、あー、エラーが出ないから使っていいんかなー、
とか思ってる人がいるかもしれないが、それは即刻やめること。
そのOSのバージョンが上がった場合にも相変わらずエラーが出ない、
ということは期待できない。

*a = 'I'; の場合は、a という配列を新しく作っている
(文字列リテラルそのものではない)ので、書き換えることができる。
861854:03/02/07 00:36
誰か教えてください〜。
>>861
激しくスレ違い
よくわからんが UNIX の話なのなら UNIXプログラミング質問すれにでも逝け
char *pというポインタを"string"(の先頭アドレス)で初期化しているだけだと考えれば混同しないと思うけど。
char *p = "literal";

char *p;
strcpy(p, "literal");
と混同して危険だと思ってるヤツもいるかもね。
>>848
> char *p = "itteyoshi";
> の場合、右辺はconstなので

互換性のために、これはダウト...だったはずだが、最近は違うのか ?
>>865
曖昧な記憶だけで書くのだけど。
char *p = "itteyoshi";
で初期化した場合、pが指す先にある領域を書き換えてはいけないというのは、

void mona(void) {
char *p = "itteyoshi";
}
void giko(void) {
char *q = "itteyoshi";
}

みたいなふたつの関数があったときに、pとqが指す先が同じものであっても
よいようにするためだったと思う。場合よってはバイナリサイズが劇的に
小さくなるからね。

実際、MS-DOSの頃メモリが苦しくて、そういう風に処理してくれるオプションが
MS-Cにあったんで重宝してた。今はあんまり気にしないのでどうなってるかしらんが(w
>>846
そのためにあるのがntohs()と仲間たち。
>>865
文字列リテラルの型は大抵constがつかないと思うけど。
869デフォルトの名無しさん:03/02/08 03:28
型を省いた関数は、戻り値int。
>>869
どんな釣りをしてるのか詳細キボンヌ
珍妙なプリプロセッサを自作しているということです。
#if defined(__2ch__)
#include "/dev/console"
#endif
Cはまったく初心者で
Pascalのポインタまでしか理解してないですけど、
K&R本はこんな俺に理解できるシロモノですか?
プログラミングの初心者じゃなければ大丈夫。
#include <stdio.h>
void *nurupo(void){printf("ぬるぽ\n");if(nurupo()==(void*)0)nurupo();return (void*)0;}
void main(void){nurupo();}
Stack overflow
>>872
#include "/dev/tty"
だろ
throw unko();
>>877
セキュリティのために、コンソールのみに限定してます。
880デフォルトの名無しさん:03/02/09 01:23
2^50とかを数字でディスプレイ上に表示する方法ってありますか?
分割するにしても数字がでかすぎて下位の数字が消えちゃうし…
>>881
2.0e+50
じゃいけないの?
>>881
うわ、880の間違いだ・・・
883デフォルトの名無しさん:03/02/09 01:32
>>881
それがダメなんですよ…
どうしたいのさ。
8852進表現:03/02/09 01:37
10000…(略
>>881
2.0e+50は2.0×10^50でつよ。

>>881
VCなら
printf("%I64d", 0x4000000000000I64);
GCCなら
printf("%lld", 0x4000000000000L);
で表示できるはず。
887886:03/02/09 01:50
あー、1I64 << 50 とか 1L << 50 とかの方が分かりやすかったな。
888デフォルトの名無しさん:03/02/09 01:56
>>887
どういうものなのでしょうか?
ご教授いただけると嬉しいのですが…
あ〜、激しく納得。64ビット整数って話か。
私馬鹿じゃん(TT)
890デフォルトの名無しさん:03/02/09 02:05
今調べているのですが、gccでも64bit整数が扱えるのでしょうか?
"long long int"型がコンパイルエラーになるのですが…
>>890
sageでよろしく。
で、コンパイルオプションでlong long型を禁止してないかチェックした?
>891
それはどういうことでしょうか?
単に
bcc32 main.cpp
とタイプしてますが…
>>891
質問は age で良いとおもうけど...

>>892
> bcc32 main.cpp

って、おい、ネタかよ。
ゴメン。1L じゃなくて 1LL だった。
> Borland C++ では long long ではなく
> __int64 で64ビット整数を扱うことができます。
> __int64 は printf("%Ld"); で表示できます。
http://homepage2.nifty.com/DRG/computer/column.html
ネタじゃないですよ〜。
とりあえずの目標は2^40とかを数字で表示する事ですから直接main.cppで実験してます。
確認作業も楽ですし…
bcc の long long型は __int64
使い方と定数の書き方&printf()の修飾子は↓のような感じで

__int64 i ;
i = 1i64 << 50 ;
printf ( "%Ld\n", i ) ;

と言うか、もろに環境依存やね…
プリプロセッサで色んなコンパイラで使えるように
細工しとくのがいいのかね。
899897:03/02/09 02:24
かぶった… (T_T)
皆様親切にThanxdThanxdThanxd!!!
"__int64"にて無事解決しました!


bccとgcc間違えてた…
gcc でも __int64 使えるんじゃなかった?
long long のエイリアスになってたような・・・。
無かった。
gcc (GCC) 3.2 20020927 (prerelease)   (Cygwin)

jni.h に int64_t ってのならあったけど、
この後ろについてるのはなんじゃらほい。
変数のサイズ指定かな?
typedef int jlong __attribute__((__mode__(__DI__)));
typedef int64_t jlong;
>>903
MinGW gcc 2.95.2 で通ったコード。


#include <iostream>
#include <typeinfo> // これが無きゃダメぽ?

using namespace std;

int main()
{
__int64 i = 1234567890;
cout << i << endl;
return 0;
}
++ の方かい。
#include <con/con> //これ誰か試して
>>906
己、自らがが実験台になってください。
コンソールから Hellow World 打ち込んだが別に問題は無かったが何か?
次スレ立てました。

C言語なら、俺に聞け! <50>
http://pc2.2ch.net/test/read.cgi/tech/1044938752/
910デフォルトの名無しさん:03/02/11 15:53
重複スレが上がってるようなのでこっちもage
913デフォルトの名無しさん:03/02/28 05:19
>>880
二進化十進符号か?
>>909
おいおい無いぞ。
もう、次次スレ立ってまふ。

C言語なら、俺に聞け! Part 51
http://pc2.2ch.net/test/read.cgi/tech/1046104909/l50
もう、次次次スレ立ってまふ。

C言語なら、俺に聞け! Part 〈52〉
http://pc2.2ch.net/test/read.cgi/tech/1047275669/l50
黄昏のぬるぽ
定期埋め立て 残り81
埋め立て 残り80
埋め立て 残り79
埋め立て 残り78
埋め立て 残り77
埋め立て 残り76
1000-75
74
埋め立て 残り73
>>918
ガッ
埋め立て 残り72
929の策
>>929
40分ほどわかりませんでした。頭が鈍ってるなぁ、寝よう。
埋め立て 残り70
printf("%3d\r",69);
>>931
こら、ハードコーディングするなよ。再利用できないだろ。
int i = 68;
/* --- 以下ここからコピペスレ --- */
printf("%3d\n", i--);
printf("埋立 残り%3d\n", i--);
934うんうんいいぞ。:03/03/17 17:52
printf("埋立 残り%3d\n", i--);
printf("埋立 残り%3d\n", __LINE__);/* ってできるのかな<試せよ */
>>935 だと、935がでませんか、と。
i--;printf("埋立 残り%3d\n", i--);

printf("ぬるぽ\n");
  ッタクモウ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/  
 (_フ彡        /  ←>>937
/* >>935の分までデクリメントしてくれた優しい>>936に萌え */

i--; printf("埋立 残り%3d\n", i--);
うめーーーーーーー
>>936
だったら、printf("埋立 残り%3d\n", 1000 - __LINE__); でいいかい ?
printf("埋立 残り%3d\n", 1000 - __LINE__); /*採用*/
printf("埋立 残り%3d\n", 1000 - __LINE__);
944941:03/03/17 21:54
>>942
printf("埋立 残り%3d\n", 1000 - __LINE__); /*なんか嬉しい*/
なんでもいいけど、あげなくてもいいじゃないですか
946デフォルトの名無しさん:03/03/17 22:15
多分スレ違いだと思うので最初に「ごめんなさい」

ちょっと教えて下さい
C++を勉強してます。ポインタ、配列、関数までは理解できました。
ttp://homepage1.nifty.com/toshio-k/prog/c/index.html
(ここで学びました)
でもここで議論されていることがさーぱり判りません
次になにをしたらいいでしょうか?
ご指導お願いします。

>>946
まずは、CとC++の違いを知る事だ。
>>946
> 多分スレ違いだと思うので最初に「ごめんなさい」

謝ればいいというもんでもない。
そんな暇があるなら、スレ一覧をじっくり眺めること。

> C++を勉強してます。

ここのスレタイトル見たか ?
C と C++ の区別もできないようならこの業界に向いてないから、「次に何もするな !!」

これが俺の指導だ。
おっと、忘れた...

printf("埋立 残り%3d\n", 1000 - __LINE__);
>>949 わらった
951デフォルトの名無しさん:03/03/17 22:25
>ここのスレタイトル見たか ?
>C と C++ の区別もできないようならこの業界に向いてないから、「次に何もするな !!」

>これが俺の指導だ。

そんな言いぐさがあるかこの大馬鹿がお前は社会に向いてないか「明日氏ね」

これが俺の指導だ
なんでもいいけど、あげなくてもいいじゃないですか?
49がまだ生きていたか。
うめうめ。
うめ
うんめぇー
気づこうぜ、釣りなんだからさ……

マジ質問なら、こう答える。
「仕事にしたいなら、まずUMLとGoFを学べ。それからだ。
 C言語なんて使える奴はいくらでもいる。」
957デフォルトの名無しさん:03/03/17 22:39
どうでもいい、埋めろ
平安京エイリアン
ロードランナー
DigDug
質問はスレ違いです。
ここは埋め立て予定地です。
あ、本当だ…… スマソ
木毎
966966:03/03/18 02:28
966
8823謎の人
埋立
残り 0x20;
計算ミスった、、、ショボーン
>>969-970
printf("残り 0x%02x;\n", 1000 - __LINE__);
C
973デフォルトの名無しさん:03/03/19 14:54
D
わたしを呼びましたね。

  ∧_∧
 ( ´∀`)< ぬるぽ
わたしを呼びましたね。

  ∧_∧
 ( ´∀`)< ぬるぽ〜
わたしを呼びましたね。

  ∧_∧
 ( ´∀`)< ぬるっ ぽ
わたしを
 ヨンデネーヨ
  ( ・∀・)   | | ガガッ
 と    )    | |   
   Y /ノ    .人   
    / ) .人 <  >__Λ ∩
  _/し' <  >_Λ∩Д´)/  
 (_フ彡 V`Д´)/   / ←>>974
            / ←>>975
>>978
    / |   / |   <なっ、なんてことするんだ!!!
   /,_ ┴─/ ヽ      , 、  ,、
  (・_.,》.'(・_,》)ミ ヽ    . / L--/ l、
 / ,,__,ニ、、 ノ( |    (・;;》 (・;;》 |    /L--/l、
 | Y~~/~y} `, ~ |   |y-,‐vi`ノl |   (・.》 (・.》 l /L--/l、
  | .,k.,.,!,.,.,r| ,! く    |, kl r| i ^<   | 'fT~ヲ x  (・〕_(・〕x|  /L/l <イクナイ
/ <ニニニ'ノ    \ / (二二‐ ' \ / l==_」 < l fmヨ ! L〔゚fヲ゚.〕、.。., .
 ∧__∧
 (´∀`) <ぬ
 ( つ つ
  ) ) )
 (__)_)
  ∧__∧
  (´∀`) <る
⊂ ⊂ )
 ( ( ( 
 (_(__)
 ∧__∧
∩´∀`) <ぽ
ヽ  ⊂ )
( ( (
(_(__)
 マゾガオオイナ!!
          | | ガガガガッ   
  ( ・∀・)   | |       人  
 と    )    | |    人  <  >__Λ∩
   Y /ノ    .人   <  >__Λ∩Д´)/ 
    / ) .人 <  >__Λ ∩Д´)/   / ←>>976
  _/し' <  >_Λ∩Д´)/   / ←>>980
 (_フ彡 V`Д´)/   / ←>>981
            / ←>>982