C言語なら、ぬるぽに聞け! Part 〈53〉

このエントリーをはてなブックマークに追加
どんどん分からなくなってきました.>>272 >>273 レスありがとうございます.
if >>272
char str[] = "abc";
char * str = "abc";

前者:ただの char型の配列(自動変数)
後者:文字列リテラル "abc" の先頭アドレスを格納するポインタ str 自身は自動変数だけど,
宣言・初期化が,どこで行われようとも "abc" という文字列はプログラムの実行中
常にどこぞかのメモリ領域を占有することになる.

if >>273
後者の宣言・初期化を行ったとき,ブロック内処理を終えると同時に,
文字列も姿を消し利用可能なメモリ領域となる.

う〜ん,所で >>273 のようであるとしたら,結局
#define STR(x) #x
hogeprint( value, STR(value));
のときの "value" は,関数(hogeprint)内でのみ存在するのでしょうか?

逆に, >>272 であるとすれば,
printf("hogehoge %d\n", value); を行うプログラムでは
実行中ずっと "hogehoge %d\n" という文字列リテラルを,
どこぞかのメモリ領域に有していることになる???

>>274
何を今頃とち狂ったレスをつけてるんだ?
俺もやってみたい
struct gmstat *型の引数でint を返す関数のポインタ
を保持する配列fnsを3個用意してそこに
gmmain, gmrank, gmentを代入してるってことですか

int *(fns[])(struct gmstat*)の場合はfnsは
struct gmstat* 型の引数 をもちint *を返す関数の配列であってますか?
int *fns[5](struct gmstat*)
のばやい
"int * を5個保持する配列"を返す関数fns?
>>275
>>273は忘れろ。
>>277
最初の解釈、「要素数3の配列fns」だ。
それから、関数は配列にできない。できるのは関数のポインタだ。
280デフォルトの名無しさん:03/04/01 18:58
文字列とポインタについて
char *str="hello";
printf("文字列は%sです。\n",str);
return 0;}

っていうコードなんですが
*strっていうのは、数値のことで
strっていううのは、アドレスのことですよね??
それなのに
printf("文字列は%sです。\n",str);
これだと文字列が格納されている変数のアドレスが表示されそうなのですが
きちんと文字列が表示されるのは何故でしょうか??
>>279
かなり考えたのになかなか分からなかったのに
わずか5分で間違いを指摘されるとは。
うーん考えてみると関数のポインタのサイズは知ることができても
関数のサイズってあまりピンとこないし、配列にできないのは
不思議では無い気がしてきました
>>280
printf()が、%sに対応した処理としてそう表示するように実装されているから。
>>280
%s の場合はアドレスを貰って
'\0'まで表示させるように定義されているから。
>>281
あぁ、書くの忘れてた。
配列を返す関数も定義できないのでその積もりで。
それと、型が複雑になりそうならtypedefを使うといい。

/* int要素5個の配列の型定義 */
typedef int (int5_t)[5];
/* int5_tへのポインタを返す、intを引き数とする関数の一例 */
int5_t *func(int foo)
{
 static int5_t sArr; /* static int sArr[5];でもいい */
 return &sArr;
}
/* intを返す、intを引き数とする関数の型定義 */
typedef int fnInt_t(int);
/* fnInt_t型の関数のプロトタイプ */
fnInt_t foo;
int bar(int);
/* fnInt_t型の関数へのポインタの配列 */
static fnInt_t *const fns[] = {foo, bar,};
285デフォルトの名無しさん:03/04/01 20:15
#include <stdio.h>
#include <stdlib.h>

int main(void){
char *str;
int num,i;
printf("何文字のaを用意しますか?\n");
scanf("%d",&num);
str=(char *)malloc(sizeof(char)*(num+1));
if(!str){
printf("メモリが確保できませんでした。\n");
return 1;}
for(i=0;i<num;i++){*(str+i)='a';}
*(a+num)='\0';
printf("%sを用意しました。\n",str);
free(str);
return 0;}

このコードに間違いあるでしょうか??
>>285
書き方がキモイ
>>285
間違いはある。
288285:03/04/01 20:29
どうしてもエラーが出るよ〜ヽ(`Д´)ノウワァァン!!
> *(a+num)='\0';
*(str+num)='\0'; じゃないの?
関数のポインタで盛り上がっているようですので、ついでにもひとつ教えて下さい。
わたしの理解では、関数のポインタは、別の型の関数のポインタとのみ変換して、
また、元に戻すことができるはずです。
しかるに、とある Linux のライブラリ関数に、次のようなものがあるのですが、
こいつの結果を関数のポインタにキャストするとやはり具合が悪いんでしょうか。

void *dlsym(void *handle, const char *symbol);
voidポインタのサイズと関数ポインタのサイズが同じなら、とりあえず動くのかな
292285:03/04/01 20:44
strに変更してもエラーでちゃいますヽ(`Д´)ノウワァァン!!
ソース書けばボタンひとつでコンパイル&実行してくれるソフトウェア使ってるんだけど
そのソフトウェアがおかしいのかなぁ
>>292
エラーをコピペしてみ。
> そのソフトウェアがおかしいのかなぁ
一つ忠告してやる、自分の無能を棚上げして開発環境にあたる根性をどうにかしろ
そのソフトウェアが C Machine なら、かなりの確率でソフトウェアがおかしい。
C Machineだったらお答えできません。
理由:絶対にインストールしたくないから。
その気持ち悪いコーディングスタイルを何とかするのが先決だ。
#include <stdio.h>
#include <stdlib.h>

int
main (void)
{
  char *str;
  int num, i;
  printf ("何文字のaを用意しますか?\n");
  scanf ("%d", &num);
  str = (char *) malloc (sizeof (char) * (num + 1));
  if (!str)
    {
      printf ("メモリが確保できませんでした。\n");
      return 1;
    }
  for (i = 0; i < num; i++)
    {
      *(str + i) = 'a';
    }
  *(str + num) = '\0';
  printf ("%sを用意しました。\n", str);
  free (str);
  return 0;
}
/* indentコマンドはじめて使ったよ */
??? func(void)
{
return func;
}

これが成立する型名(???の部分)がどうしてもわかりません、誰か教えて下さい。
>>299
void *
すべてのポインタは暗黙で void * に変換できたはず。
301285:03/04/01 22:13
c machineですた。(泣

まだC言語初めてまだ4日だからきちんとしたコードが書けないよ、
ヽ(`Д´)ノウワァァン!!
綺麗なコーディングスタイルってどういうのでつか??
やっぱり関数と関数の間に一行開けたりとかでつか?
302デフォルトの名無しさん:03/04/01 22:16
今度、会社でCをまったく知らないハードの先輩にCを教える事になりました。
ただ、私自身学生時代に触っただけで、2年のブランクがあります。
で、教えてもらいたい事は、以下の2つです。
1.この様な状態の2人にあったCのテキスト
2.Cでの学習環境を作る上でのフリーソフト
この2つがよく分かりません。
教えてください。
>>301
>>298はコーディングスタイルのひとつの例。
で、C Machineは捨てようね。

>>299
void *でも返すしかないね。
>>301
C Machineを窓から投げ捨てろ。
そしてBCCを入れろ。

話はそれからだ。
305300:03/04/01 22:36
>>299
適当なこと書いてしまった……。
すべてのポインタ→すべての型へのポインタ
void * が関数へのポインタを保持できる大きさを持ってなきゃ駄目だ……。

とりあえず VC++6.0 では問題なくコンパイルできるが、厳密にはどうすんだろう?
>>305
>void * が関数へのポインタを保持できる大きさを持ってなきゃ駄目だ……。
一律32bitじゃないの?Windows95以降のポインタって
push argv
push argc
call main
add esp, $8
308285:03/04/01 23:03
C Machineってそんなに悪評高いソフトなんだ、、、。
よろしかったら、その訳を聞かせてください
>>308
>>298のようなプログラムが動かないんでしょ?糞です。
310デフォルトの名無しさん:03/04/01 23:15
あの〜defineって

#define ABC 100 みたいに使うんですよね

参考書には

#ifndef ANYHEADER_H
#define ANYHEADER_H
  ・
  ・
  ・
#endif って書いてるんですけど、なんだかdefineの
使い方がわかんなくなってきました。教えてください

>>305
その場合
void (*)(); とかint (*)(); とかを汎用関数ポインタの代わりとして使う。 
当然キャストは必要。void *を使うという解は移植性に乏しい。
>>310
#define ABC 100
int a=ABC;    /* int a=100; */

#define ABC
int a=ABC;    /* int a=; */
314デフォルトの名無しさん:03/04/01 23:45
>311
ありがとう、なんだかわかってきました。
#ifndef ANYHEADER_H
#define ANYHEADER_H
  ・
  ・
  ・
この例文で、ANYHEADER_Hが2回目のインクルードでは定義されると
あったんですが、どういう意味なんですか?
#define ABC 100 の定義とは全然意味違うんですよね。すみません、
ほんと初心者なもので
>>314
違う、ANYHEADER_Hは一度しか定義されず、最初にこの定義に
出会った時のみ#endifまでの間をコンパイルするという使い方。
2回目以降は既にANYHEADER_Hが定義されているので、
スキップされる。
ヘッダファイルのある部分が二重にコンパイルされてエラーが
出るのを防ぐ常套手段。
316デフォルトの名無しさん:03/04/02 00:00
ということは
#ifndef ANYHEADER_H
#define ANYHEADER_H  の順番が大事なんですか?
仮に
#define ANYHEADER_H
#ifndef ANYHEADER_H としてしまうと、すでにANYHEADER_Hが
定義されているから、一度もインクルードされないってなるんですか?
間違ってたらすごく恥ずかしい質問になってしまったような・・・
>>316
正解。
>>316
そうです。というかコンパイラによっては、#undefせずに複数回#define
しようとすると警告が出るものもあります。
319デフォルトの名無しさん:03/04/02 00:08
>313
#define ABC
int a=ABC;    /* int a=; */
上の例でABCは未定義なんですか?それとも宣言してるから定義している
ってことになるんですか?
>>319
マクロは定義されるけど置換え対象が空だというだけ
そうなるかもなー

cpp test.c
とかやってみるとプリプロセッサがどう動くか分かる
ただしstdio.hとかをinclude すると出力たくさんですぎるので
全部外して遊んでみたら?
322デフォルトの名無しさん:03/04/02 00:12
教えてくださったみなさん、ほんとにありがとうございます!
なんだか数日間の悩みが晴れました。すぐに復習ノートに
書き込まなきゃ
#include <stdio.h>
void *(*)(void) func(void)
{
printf("プ");
return func;
}
int main()
{
(*(*(void ((*)(void))((*)(void)))(*(func()))())())();
return 0;
}

これでよろしいのでしょうか?
>>323
それコンパイル通る?
>>323
typedef int (*fun_t)(); /*汎用関数ポインタ*/
typedef fun_t (ptrfun_t)()/*汎用関数ポインタを返す関数へのポインタ*/
fun_t func()
{
return (fun_t)func;
}

main()
{
ptrfun_t state;
while(1)
state=(ptrfun_t)(*state)()
}

こうしなさい
>typedef fun_t (ptrfun_t)()/*汎用関数ポインタを返す関数へのポインタ*/

typedef fun_t (*ptrfun_t)();/*汎用関数ポインタを返す関数へのポインタ*/

失礼
ptrfun_t state=func;
も忘れてた。

もしくは別解凍として
struct fun_t { struct fun_t (*fun)(); };

fun_t func()
{
struct fun_t ret={func};
return ret;
}

main()
{
struct fun_t state={func};
while(1)
state=(*state.fun)();
}
328デフォルトの名無しさん:03/04/02 01:07
#include <stdio.h>

int main(void)

{
int a,b;

puts("2つの整数を入力して下さい。");
puts("整数A:");
scanf("%d",&a);

puts("整数B:");
scanf("%d",&b);

printf("Aの値はBの値の%fです。\n",(double)a/b*100);

}

このファイルをコンパイルしたら実行ファイルはできるのですが次のような
警告がでます。どうすればいいのでしょうか?

2.a.c:17:2: warning: no newline at end of file
>>328 英語を勉強する。
no newline at end of file
いくらなんでもこれは分らなきゃだめだろ?
ワラタ
332328:03/04/02 01:18
>329フャイルの最後に新しい行がないってことですか?
>330 それが分からないのです。なぜだかわかりませんが
コンパイルするのに5分以上かかりました。
333デフォルトの名無しさん:03/04/02 01:26
今日はじめてCを始めた初心者なんですが
とりあえずhello worldを表示させる

#include<stdio.h>
main()
{
printf("helloworld\n");
}
を打ち込んでコンパイル、実行できたのですが
何も表示されませんでした。

何が問題なのかどなたか教えてください。
何か表示されたはずだが、>>333がとろすぎるので
表示を読む前にウィンドウがとじてしまっただけ。

目を鍛えろ。
パチスロとかお勧め。
で、擦るだけ擦ったらVCスレで聞きなおせ。
>>333
本当にコンパイルして実行ファイルできたの?
>>333
環境を教えろや
(333 のよそー)
$ make test
$ test
$
gcc 2.95 です。
Linuxです。
>>337
違います。
gcc -o test test.c
です。
339デフォルトの名無しさん:03/04/02 02:11
>>338
testだとtestという用意されたコマンドが実行されるだろう。
./testと入力して実行する。
340339:03/04/02 02:12
いや、大抵はシェルの組み込みコマンドか>test
>>338
>>337がつっこんでいるのはコンパイルの時の命令じゃなくて、実行時の命令だと思うぞ。
やっぱり関数ポインタはキモイ
int func(void);
これがfunctionポインタの宣言だとしたら綺麗だけど、プロトタイプとかぶるからねぇ。
それか、ぜんぶ
(*printf)("hello");
みたいにするとか。
ねえねえ
functionって
ファンクシャンか
ファンクションの
どっちで読んでる?
漏れの周りでは前者なんだけど、
後者って人は居る??
345デフォルトの名無しさん:03/04/02 03:07
ファンクション

>>343
int func(void);じゃどこにも*がないからポインタに見えないYO!
ファックション
俺はフャンクションと呼んでいる。
鼻から息を抜くように発音するのがミソ。
ファンクトイオン
フヌクシオンヌ
へーちょ
いいかも♪とマジレスしてみる。
352デフォルトの名無しさん:03/04/02 03:20
object pascal だと関数型があって
var
hoge: function (i:integer):integer;
みたいな感じだっけ??
あまり使う人居なさそう。
俺はNull Pointer Exceptionをぬるぽと読む。
 ( ・∀・)   | | 
 と    ) <| | |  ザシュッ
   Y /ノ  .・・人 ∴:・
   // )  ・ <  >__Λ∩
  //し' //. V`Д´)/
  (/彡          /  ←>>352-353
355デフォルトの名無しさん:03/04/02 03:27
ライブラリの使い方を
すみません、超初心者ですが質問させてください。
mpg321 という純粋に mp3 などを再生するだけのプログラム
を利用し、front end みたいな物を作りたいのですが
例えば player というプログラム名とし、player をバックグラウンドで
起動しておき、
> player -back
などと引数付きでコマンドを打つと、
既に起動しているほうの player に引数を渡して、新しい方は
すぐに終了するようにしたいのですが、どうすればいいか見当が付きません。
どんな感じになるか教えていただけないでしょうか。よろしくお願いします。
>>356
プロセス間通信
>>357
プロセス間通信でぐぐってみたら、
ttp://www.ncad.co.jp/~komata/c-kouza13.htm
を見付けました。これを元にやってみたいと思います。
どうもありがとうございました。
>>314
<この例文で、ANYHEADER_Hが2回目のインクルードでは定義されると
を、
>この例文で、ANYHEADER_Hが2回目のインクルードでは定義されていると
とすれば、自然だと思う。誤植なのか、もしかしたら、そのテキストの
著者は日本語が不自由なのではないでしょうか。
for関数のセパレーターが';'なのってキモくない?
他の関数みたいに
for(i=0, i<n, i++);
の方が良くない?
添付ファイルを作る関数があるけど、それって変じゃない?
後から作ったらそれは添付ファイルとは言えなくない?
>>360
for(i=0, k=0, i<n, i++);となれば区別つかないから却下。
>>362
for((i=0,k=0),i<n,i++)とやればよい。
・forは構文であって関数ではない。
・,は演算子であってただのセパレータではない。
以上
こういう仕様だったらよかったのにという話なのに、なんで今の仕様を持ち出してくるんだろう。
詰めの甘い仕様を持ち出すから叩いただけなんじゃない?
for の後に条件反射的に( ; ; )書くクセがあるので
今の構文じゃないと困る。
そんなぁ( ; ; )
>>360
エープリルフールも終わったんだからネタはやめろ。
Cではforはあくまでも「文」であって「関数」じゃねーぞ。
> エープリルフールも終わったんだからネタはやめろ。

2chで言うなよ。
じゃあ、関数でforとかifって作れる?
void my_for(???)
{
}
void my_if(bool b)
{
return;
}
みたいに。
>>356
取り敢えず、ファイルで受け渡しするようにしてみたら?
プロセス間通信はそれからでもいいと思うが。
>>371
正直マクロで十分だろう。
嫌われるけど
int型の2とか4を
1ビットbool型にキャストすると
falseになるの?
375デフォルトの名無しさん:03/04/02 14:36
>>374
bool型って何?_Boolのことか?
>>373
そもそも、forを関数とか言い出した>>360が阿呆なわけで。
>>374
Cにはbool型なんてない。

処で質問。
malloc()よりはalloca()の方が安全だと思うのだがansi標準にはない。
使うべきか否か。
>>376
自分で決めろ。
>>377
そりゃそうだ。
で、君の意見は?
>>378
mallocを使え。
mallocよりもallocaの方が安全ってどういうこと?
自動で解放されるんだっけ?
自動で解放されないと危険なの?
alloca()にはfree()は不要。つーかfree()してもいいのか?
試しにfree()してみたらエラーはでないが。
ヒープじゃないんだからfreeなんてするなよ!
>>376
> malloc()よりはalloca()の方が安全だと思うのだがansi標準にはない。
C99の可変長配列ならばalloca()と同等の処理をするはず。
結論:C99を使う
>>383
free()したポインタを再びfree()しても
俺の処理系ではエラーにはなりませんでしたが何か?
# ま た 未 定 義 か
>>385
判った。gccの拡張機能でお茶を濁すとするよ。
>>383
密かにスタックを壊してる罠。
借りすぎに注意しましょう。ご利用は計画的に。
390manpage厨:03/04/02 17:05
alloca 関数は、機種とコンパイラに依存する。
多くのシステムでは実装にバグがあるので、この関数の使用は推奨されない。

多くのシステムにおいて、関数コールの引き数のリスト内では alloca が使えない。
これは、 alloca によって予約されるスタック領域が、
関数引き数に使われるスタック領域の中に現れてしまうためである。


ということらしい。使わないでおけ。
391デフォルトの名無しさん:03/04/02 19:11
Cのコンパイルを実行しようとして
参考書とかにコマンドプロンプトで
gcc aaa.c
で実行するとありますが

これで実行すると
内部コマンドとして認識されていませんと出て実行されません。

何が環境設定みたいなものをしなければならないのでしょうか?
参考書やホームページなどにはその辺の記述は全くないのですが
教えてください
>>391
まずインストール汁
393デフォルトの名無しさん:03/04/02 19:19
>>392
インストール・・・?
そんなのあるの?

参考書だとコマンドプロンプトに記述のみしか載ってないが・・・?
>>393
そもそも環境はなんだよ。コマンドプロンプトと書いてることからするとWindows NT系か?
cygwinを使おうとしてるのか?
395デフォルトの名無しさん:03/04/02 19:30
>>394
Windows2000
ソースは普通に秀丸で
それを拡張子をCにしてCドライブに保存

プロンプトでCドライブ配下に移動して
gcc aaa.cを実行
>>395
Win2000そのままだったらgccなんて入ってないよ。
397デフォルトの名無しさん:03/04/02 19:38
>>396
すいませんどうするれば2000やxpに
gccという奴を入れることができるのですか?

それとも
コンパイルするのに他のやり方とかありますか?
>>397
ここの>>1>>2 を見てから言ってください。
訂正 >>2以降を。
400デフォルトの名無しさん:03/04/02 20:14
 教えてください。
 マ板で見たんだけど、以下の様なソースね。

int foo( void )
{
char a{4], b[4]; // bを消すと落ちる

  ...明らかに a から b へのオーバーライド

 Unix系なら明らかにスタックを破壊するので理解できるが、Win系だと
下から上に積まれるので『落ちはしない』様な気がするのですけど・・・
 詳しい人お願いします。







>>400
コンパイルすらできません。
というか、Unix系とかWin系とか関係ないし。
意味がわからん上にすてきな感じのインターネットですね
a{4]
403デフォルトの名無しさん:03/04/02 20:24
<<401
 そのレベルの人には聞いていません。
<<402
 目良いですね。気がつきませんでした。

彼の超越したレベルには誰もついて行けてないと思われ
てか、その402と401はどこに出力してるのかわからんな。
406デフォルトの名無しさん:03/04/02 20:34
<<404
あなたのレベルが低いだけです。
407404:03/04/02 20:38
<<406
そうですかごめんなさい
僕の頭もオーバーロードして落ちそうです
括弧の内側にスペース入れちゃう人は嫌いです。int foo( void )←これ
 ∧_∧
( ´∀`)< ち○ぽ
>400
WinでもIAなCPUではスタックは上から下だけど。
return( "1" );
このチンカス!
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>409
413デフォルトの名無しさん:03/04/02 21:03
>>410
ぬるぽはAI
return ( ( void * ) atoi( "0" ) );
415デフォルトの名無しさん:03/04/02 21:11
return((void*)atoi("0"));怒
416デフォルトの名無しさん:03/04/02 21:19
ライブラリに頼るのは恥ずかしいことなの?
>>416
何を使うかの状況判断ができない人のほうが恥ずかしい。
418デフォルトの名無しさん:03/04/02 21:54
400です。すいませんマシンがトラぶってレス遅れました。
私の質問は、以下の様なコードにおいて

#include<stdio.h>

voidfoo(void )
{
inti;
chara[4];

for( i = 0; i < ???; i++ )
a[i] = 0x00;

}
voidmain(void )
{
foo();
printf( "I'm safe\n" );

}
 ???が4を超えた場合、必ず飛ぶかどうかという質問です。
 Unix系の場合、スタックは上位から下位へ積まれますので、???が5になれば
リターンアドレスを書き換えて飛びそうな気がします。
 しかし、Win系の場合、スタックは下位から上位に積まれるので、飛びはしない
のではという事です。
 言葉が足りなくてすいません。




        ま    た    未    定    義    か



>>418
大丈夫、Win系でもスタックは高位アドレスから低位アドレスに向かって積まれるので
予定通りきちんとリターンアドレスを破壊してくれる。
一応念のために、LSI-CでもVC++でもそのようにコードを吐くことを確認したから間違いないだろう。
421デフォルトの名無しさん:03/04/02 22:10
質問です。
10秒単位で時間を表示するプログラムを作ってみたのですが、
時間が10秒単位になった瞬間、for文を使っているので何回も表示されてしまいます。
これを10秒単位で1回だけ表示にしたいのですが、解決策はあるでしょうか?
口頭で言ってもうまく説明出来ないので、ソースを晒します。
#include <stdio.h>
#include <time.h>

void everytime(void);

int main(void)
{
everytime();
return 0;
}

void everytime(void)
{
char *s;
time_t t;
for(;;)
{
time(&t);
if((t%10)==0)
{
s=ctime(&t);
printf("%s\n",s);
}
}
422デフォルトの名無しさん:03/04/02 22:11
れ、bccでは通ったよ。
タブがつぶされてるのはかんべんね。
まさか voidfoo とか chara[] とか見て気づかない香具師はいないよね。

>>421
最後に実行した時間覚えておけばいいんじゃん?
424デフォルトの名無しさん:03/04/02 22:13
>>418
Intel 系 CPU のスタックは
アドレスの大きい方から小さい方へ確保される
(関数抜けた時に add esp, * でスタッククリアだし)。
だから、オーバーしたらリターンアドレスが書き換えられる可能性がある。

もしくは、その前に i の値が書きかわって
変なことになることもあるかもな。
今回の場合は i を 0 にリセットして無限ループか。


>>419
一応バグの振る舞いを知っておくのも必要だと思うが。
>>421
適切なsleepを挟んでCPU資源を解放しろ。
>>422
それをつっこむと、そのレベルの人には聞いていません。と言われるもので。
>>425
命令しないでください!
428デフォルトの名無しさん:03/04/02 22:15
>>420
 初めてのまともなレスありがとうございます。
 
 そっか勘違いかね?昔のMS-DOSとかでもスタック方向は高位ー>下位
だっけ?
 知ってたら教えてね。
>>428
いい加減スレ違いな話題は(ry
>>424
最適化を掛けるとiはレジスタ実装になるので問題は出ない。
それどころか、ループ回数が10数回程度ならループさえ消えてしまう可能性が高い。
仮にそうでなかったとしても、iの方が低位アドレスに配置されるのではないだろうか。
>>427
おまえには言ってない。
>>423,>>425
ご返答どうもありがとうございます。
とりあえず>>423さんの方法でやってみようと思います。
>>427は偽です。
433デフォルトの名無しさん:03/04/02 22:22
>>424
 どうも。私の勘違いですね。
 お騒がせしました。
>>429
 スレ違いですか?
 このスレはC言語の話でしょ。
 アセンブラレベルの話は少しスレ違いですが、せめてスタックの
話くらいはさせて欲しいです。
春だなぁ。
desune
436デフォルトの名無しさん:03/04/02 22:29
C言語にはかわりないんだから、環境依存の話くらいさせてほしいです。
実験してみれば済むことを、それをできるスキルの人間が聞くのはスレ違い。
>>436
標準Cの話題じゃなかろうに。
ビタミンCの話題じゃなかろうに。
440デフォルトの名無しさん:03/04/02 22:46
 400です。
 もひとつ質問!!
socket IO において recv(), send() を実行中に、signal を受けると、
エラーが生じます。(errno=EINTR=23 だっけか?)
 この場合、socket buffer に中途半端なデータが残ることは無いので
しょうか?
 私は sigprocmask() で来そうな signal をはじいてますが、EINTR の場合
差し戻すような処理でも問題ないでしょうか?
どこが破壊されるか
わかったところでなにか役に立つんですかね?
442デフォルトの名無しさん:03/04/02 22:47
応援しているぞ400!
>>440
>>1くらい読みましょう。
444デフォルトの名無しさん:03/04/02 22:50
>>441
 全然役に立たないです。
 疑問を感じただけです。
445400:03/04/02 22:54
>>443
 ググレって事ですか?
 板の趣旨からは外れてないつもりですが・・・
446デフォルトの名無しさん:03/04/02 22:54
<<443
 低レベルな人は黙っていてください。
447デフォルトの名無しさん:03/04/02 22:55
448400:03/04/02 22:56
あまり盛り上がらないので、寝落ちします。
お騒がせしました。
>>444
未定義、不定の挙動を把握することはデバッグ時に大いに役立つぞ。
いや、変に盛り上がってると言えなくも無い
つか、>>418
> Unix系の場合
こーゆー寝ぼけた発言に対して誰か突っ込んでやれよ。
>>437
その考え方は危険だよ。
>>451
むしかえすと、また低レベルな人は黙っていてくださいと言われますよ?
454333:03/04/02 23:20
>>334
一応実行後一時停止するようになってるのですが・・・
>>335
はい。コンパイルOKという表示がでています。
>>336
windowsでLSI-86試食版3.3
に「C言語を始めよう」というソフトを
組み合わせて使っています。

始めはフォントが黒いせいで見えないのかと思ったのですが
選択範囲を指定して選択してみても反転しない
のでどうも表示されていないようです。

どうか教えてください。
455400:03/04/02 23:33
>>447さん
 どうもサンプル拾ってきました。
 差し戻さずリトライすれば良いようですね。

 こんなこと自宅でテストすれば良いのですが、環境がありませんので
皆さんのお知恵を拝借させていただきました。ありがとうございます。

>>451さん
 何が寝ぼけているのか解りません。
 論点を説明願います。
 OSではなく石レベルの話だと言いたいのでしょうか?
 
もういい、もういい、この手の話は

   糸冬
>>418
char a[5] がリターンアドレスに重なっており、
なおかつ、リターンアドレスの上位8bitがたまたま0だったとする。
Intel 系のCPUでは、a[5]の所は下位8ビットなのでそこに0を書くと
はまるが、Motorola 系のCPUでは、そこは上位8ビットなので、
0x00 を書いても運良く助かるってこと。
Intel系やMotorola系以外のバイトオーダーを使うCPUもあるので、
環境に激しく依存する。
<a[5]
>a[4]
459400:03/04/02 23:42
>>457さん
どうも。
 で 終わり。
>>454
確実に表示はされているはず。
printfの後にfor文で無限ループすれば?
>>421 こんなのはどうですか。
#include <stdio.h>
#include <time.h>
int WaitTime(time_t*timeAdd,time_t waitTime)
{
time_t nowTime;
time(&nowTime);
if(*timeAdd+waitTime<=nowTime){time(&(*timeAdd));return 1;}
return 0;
}
int main(void)
{
time_t wait10,wait100;
time(&wait10);time(&wait100);
for(;;)
{
if(WaitTime(&wait10,1))printf("%s",ctime(&wait10));
if(WaitTime(&wait100,10))break;
}
return 0;
}
>>461 だめです。
463デフォルトの名無しさん:03/04/03 04:14
sleepってlinuxしかつかえないの?

#include <stdio.h>
#include <time.h>
/* 時間がnow+10になるまで待ってnow+10を返す */
time_t mysleep10sec(time_t now){
   time_t t;
      
   while ((t = time(&t)) < now + 10){
   }
   return t;
}
int main(void)
{
   time_t t;
   char *s;
   s=calloc(1,256);
   /* 10の倍数秒になるまで待つ */
   for (time(&t); t%10!=0; time(&t)){
   }
      
   s = ctime(&t);
   printf("%s\n", s);
   for(;;){
      t = mysleep10sec(t);
      s = ctime(&t);
      printf("%s\n", s);
   }
   return 0;
}
>>463
FreeBSDにもあるよ。
以下、FreeBSDのman 3 sleepから抜粋

>STANDARDS
> The sleep() function conforms to ISO/IEC 9945-1:1990 (``POSIX.1'').

標準関数じゃないね。
Cygwinのmanに無かったからちょっとびっくりした

$ man 3 sleep
No entry for sleep in section 3 of the manual
>>463
WindowsにはSleepってのがある。

>>465
nanosleep(セクション2)は?
467461:03/04/03 06:23
>>462
どこがダメですか?
>>467
とりあえず無限ループ+最後にifならdo{}while使えば?
指定した時間待つ関数と表示する関数は分けた方がいいと思う。
>>467
time(&(*timeAdd)); が意味不明、間違えじゃないけど
time(timeAdd); でいいのでは?
471461:03/04/03 09:22
>>468 for(;;)以外使ったこと無かったので。分かりました。
>>469 ? 分かれてないですか?
>>470 確かにそうですね。
とりあえずビジーループするクソなソースを貼るのはやめろ。
(int main, int argc, char **argv)
{
(printf, "hello C");
return 0;
}

こういう言語仕様だったら見た目がもっとカッコイイソースが書けたのにね。
forの構文がどうたら言ったたヤツか?
いい加減にスレ違い、板違いなんで消えろ
>>473 どうせならこうしろ
((int main) ((int argc) (char **argv))
(printf "hello C")
(retrun 0))
>>475
イイ!!
そういう感じのコンパイラ作ってみるよ。
(((int) (main)) (((int) (argc)) ((char) (*)(*)(argv)))
((printf) ("hello C"))
((retrun) (0)))
>>473
lispで我慢してろ。Cに手を出すな。
#define BEGIN {
#define END }

並に、氏んでいいよ。
括弧が多いとlispかよ(プ
>>466
cygwinでは
manは無いけどsleep()は何故かあった。
しかもなにもインクルードしないのに使えてしまって不思議
sleep(1)は1秒止まるし
>>477
(((( ;゚Д゚))) ガクガクブルブル
483デフォルトの名無しさん:03/04/03 12:20
非常にスレ違いかもしれんが、基本教えて・・

MS-DOSプロンプトの話なんだが、Cを実行した後の大量のデータがほしぃ場合、
スクロールしてしまって、始めの方のデータ見れない・・
これどうやってみるんだろ?
>>483 ファイルに書く
>>483
出力をファイルにリダイレクトして、後から見れ。
ケコーン(w
リダイ・・・やめた
foo.exe > a.txt

で、画面に出力する内容をa.txtに保存する。

foo.exe >>a.txt

で、a.txtにどんどん追加する。

がんがり。
489デフォルトの名無しさん:03/04/03 12:31
>>484,485

詳しくやり方を教えてください・・・スマソ
> hoge | more
で1ページずつみれるよ。
>>483
×:Cを実行した後の大量のデータがほしぃ場合
○:コンパイルエラーの最初の方のエラーを見たい場合
493デフォルトの名無しさん:03/04/03 13:33
>488

できました。ありがとうございます!
494デフォルトの名無しさん:03/04/03 13:46
Cの書籍としてよくでてくるK&RはCを勉強する過程で買っておいたほうがいいんですか??
>494

人によります。

漏れはおすすめしない。
496デフォルトの名無しさん:03/04/03 14:00
まあ損はないだろうが俺は不要だった。
今まで読んだことがないです。

むしろ、アルゴリズムとデータ構造の本を読んだほうが幸せになれることも……
498デフォルトの名無しさん:03/04/03 14:16
>495
お勧めはなんですか?
>>498
どっちかて言うとA定食の方が美味しいよ。安いしね。
>>481
printfだってstrcpyだって(ヘッダーファイルを)インクルードしなくても使えるだろ。C++じゃあるまいし。
今日ってまだ4/1だっけか?
>>500
4月バカはもう終わりましたよ
>>502
もしかして宣言しないと関数を呼び出せないと思っている?
(・∀・)キュンキュン
くらえ!
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>504
506デフォルトの名無しさん:03/04/03 17:46
16進数の44を10進数の44と変換したいんですが
いかようにすればよろしいのでしょうか?
何分厨房ではございますがご教授のほど
おながいいたします。
意味不明
508デフォルトの名無しさん:03/04/03 17:55
>>506
16進数の44を10進数に変換したいの?
509デフォルトの名無しさん:03/04/03 18:06
>>508サソ

16進の44を10進数に変換といことではなくて
16進の44を10進で44としたいのです。
16進で55があったら10進では85ですよね?
そうではなくて例え、16進で44というデータが
あっても、それを強引に10新の44と
プログラムに思いこませたいのです。

わかりづらい説明ですが、おながいいたします。。。
int func(int val)
{
return ((val & 0xf0) >> 4) * 10 + (val & 0xf);
}
じゃあ0xfeとかだとどう変換したいんだろう?
ナゾ。
512デフォルトの名無しさん:03/04/03 18:28
>>510サソ
アリガトンゴザイマス
カンゲキ・・・
シフトかぁ。。。

>>511サソ
なんかしんねぇけど
A-Fは入ってこないというナゾの仕様なんです。
もう寝るね(=^-^)/~~
はえーよ
BCDのことではないのか
>>512
プログラムは何を根拠に入って来るデータを16進だと判断するの?
しらねぇ奴、知恵のねぇ奴に限ってあれこれ騒がしいな。
あれこれあれこれ
519512:03/04/03 19:46
>>516サソ
ダンプファイルがありまして、
それを関数に渡すんですが
その関数が10進で来ることを予期しており
ヘキサじゃダメというだけの理由でございます。
動的なメモリで作った配列があり、
中身を保持したまま配列の数を5000から5005などに増やしたいときは
いったん別に仮配列を用意してコピーしてから元配列を開放、
また新たに元配列にメモリを確保して仮配列からコピー
という方法しかないのでしょうか?
なぜ、仮配列を新配列にしないの?

char *foo = malloc( 5000 ) ;
...
{
char *neon = malloc( 5005 );
memcpy( neon, foo, foolength );
free (foo);
foo = neon;
}
単に、新しい動的メモリを作って、そこにコピーすれば?

配列確保→新しい配列のポインタ取得
古い配列 → 新しい配列 にデータ転送
古い配列解放
古い配列のポインタを指す変数=新しい配列のポインタ

または、manpage realloc
なぜ realloc を
524522:03/04/03 20:46
キャ……
reallocでダメなのかな
526522:03/04/03 21:04
こういう感じじゃないの?

www9.plala.or.jp/sgwr-t/lib/realloc.html
527520:03/04/03 21:08
>>521
>>522
>>523
reallocなんて関数があったのを始めて知りました。
ありがとうございます。
528520:03/04/03 21:12
>>525
>>526
書き込んでる間に書き込みが‥‥
ありがとうです。
529デフォルトの名無しさん:03/04/03 23:42
Cのソースとか見るとたまにputsを使ってるのを見かけますが

puts関数の存在意義って何ですか?
Printfで全て間に合うような気がしますが・・・

>>529
速度は?
Printfは絶対に無(ry爆
532デフォルトの名無しさん:03/04/03 23:55
>>530
わずかにタイプ速度が(ry
>>531
printfね・・・

>>532
タイプの速度ってだいたい
一個なら1秒も変わらんし
複数ある場合はほとんどコピペじゃないのか?
で、実行速度は?
puts(s);
printf("%s\n", s);

だったら puts を使うなあ。
>>534
putsの方が速い。
でも処理速度が問題にならなくて、別の箇所でprintf使ってるなら
俺ならprintfで統一する。
537デフォルトの名無しさん:03/04/04 00:14
529君検証して答えるべし。速度は?
530==534は、本質に切り込む問いかけしているぞ。
ま、なんだ。
勘のイイ奴なら何をどう調べればよいか分かるもんだが。
大は小を兼ねると言ってもそれは機能面だけの話で、
多機能さを実現するためのコスト(printfの場合は書式の
解決処理ね)が、無駄というか、邪魔になる場合がある。

でもって、printfは処理が遅くて、putsは早い。
数百回の処理じゃ違いは体感できないが、何十万回も
繰り返し処理する場合は、その差が顕著になる場合があるよ。
何十万回もputs呼ぶなら、
コンソールのスクロールの方が
圧倒的に遅くなると思ふ。
コンソールのスクロール? とつっこんでみる。
> /dev/nullと書こうと思ったがおまいには > NUL がお似合いだ

コンソールに大量にログ文字列出力しといて、性能遅いとか
ほざく技術者がいっぱいいるのですが、あんたら馬鹿ですか?
トオモウ事が多いです…
>>542
思うだけじゃなくて、本人に家。
質問です。
1行目にデータ件数を書いて、2行目以降にデータを記述したファイルから、
乱数で出した数字番目の行のデータを取り出して表示させたいのですが、
fgetやfscanfを使って繰り返し読み込ませて目的の行まで進める、
という方法以外に何かいい方法ないですか?
>544
・一気に全部読んで、改行をキーにして探す。
・一行のデータ量が固定なら、計算で長さを出す。で、ファイルポインタを移動させる。
・データ構造を工夫する。
・その他。(他のレス待ち含む)
・最初に全部読んでファイルポインタだけ配列に記録しておく。
 取り出すときは乱数で行数を添え字にしてポインタを取り出しfseekのあとfgets

ここから下は余談

高速化のためにこの配列をファイルに記録しておき、
次からはテキストファイルと配列を収めたファイルのタイムスタンプを見て、
テキストファイルの方が新しければ配列に取り込み、それをファイルに記録、とかやる。

# おれはわりとよくこういうことをやる
最初に全部メモリ上に読んで乗せとく
データ数が少ないならこれが速い
メモリマップトファイル
>>548
アレって一回ファイルをメモリ上に展開するのか?
#define hoge(__p) \
  hoge_##__typeof__(__p)(__p)
として、__p の型に応じて後始末をしてくれるマクロを作ろうとしてるんですが、
うまくいきません(hoge___typeof__ は未定義だと言われる)。
どうすればうまくいきますか?
551デフォルトの名無しさん:03/04/04 12:08
ソートする対象の要素が膨大な時は、やっぱファイルを利用するのが一番なのか?
r+bモードで開いて、ファイルポインタを走査させて比較するみたいに・・
>>551
いいえ、DBを使ってSQL発行した方が楽でしょう。
>>546の余談でやってるのって要するにインデックスだし...
>>551 merge sort
>>549
アクセスされるまでロードしない。
仮想メモリに似た方式。
555551:03/04/04 13:16
>>552>>553 エレガントな方法をありがとうございます。
変なことを書いちゃってスマソ。
556544:03/04/04 14:51
レス遅れてスマソ
色々な方法があるんですね。試してみます。ありがd
>>550
__typeof__(__p) なんてのは聞いたことがないので
これがプリプロセッサで処理されるのか
コンパイラで処理されるのかは分からないが、
前者であったにしろ、それが展開される前に
トークンが結合されてることは確かだろう。
よって、直接 hoge_int(p) とか呼ぶのが吉。

C++ が使えるならデストラクタだの
オーバーロードだのテンプレートだの利用できてええんだがな...。
558550:03/04/04 16:55
>>557
分かりました、ありがとうございます。
gcc のヘッダで使っていたんですが、拡張機能だと思います。
スレ違い、スミマセンでした。
>>550
__typeof__()が通常のマクロと同じように扱えるのなら、

#define dcat(a, b) a##b
#define cat(a, b)  dcat(a, b)
#define hoge(__p) cat(hoge_, __typeof__(__p)) (__p)
560550:03/04/04 17:30
>>559
ありがとうございます。でもダメでした。
cpp してみたら hoge___typeof__() に展開されていたので、
プリプロセッサではなくコンパイラで扱っているみたいです。
561デフォルトの名無しさん:03/04/05 00:09
memcpyについて教えてください。

int num = 0x11223344
char a[sizeof(int)];
memcpy(a,&num,sizeof(a));
といった例文なんですが、参考書によるとnumが16進数だから
11223344からは2行ずつ数値をコピーすると書いてます。
なんで2行で4バイトもコピーされちゃうんですか?
すみません、超初心者なもので
2行ではなく2桁では?
563デフォルトの名無しさん:03/04/05 00:16
あ、そうでした・・・でもわかりません
>>561
>なんで2桁で4バイトもコピーされちゃうんですか?
いいえ、1バイトです。
void *memcpy(void *dest, const void *src, size_t n);
memcpy()はメモリ領域srcの先頭nバイトをメモリ領域destにコピーする。コピー元の領域とコピー先の領域
が重なってはならない。重なっている場合はmemmove(3)を使うこと。

memcpyと、2桁づつコピーされることは関係ない。
16進数では、2桁で0から255までの数値を表現できるが、
それがたまたま1バイト(8ビット)で表現できる数値の範囲と一致するだけ。
566デフォルトの名無しさん:03/04/05 00:29
参考書をそのまま写すと
numに与えられた数値の先頭の0xから16進数であることが
わかるので、11223344からは2桁ずつ「16*2=32(ビット)=4(
バイト)」、数値がコピーされます
とあるのですが、わたしが根本的に勘違いしているのかも
16bits*2 ?
8bits *4=32bits=4bytes なら分かるが。
燃やそう
その本、タイトルに「C言語」って入ってない?
570デフォルトの名無しさん:03/04/05 00:39
>そうなんです。8bits *4=32bits=4bytes なら納得できるんですが
16*2=32はよくわかりません。char型に2桁ずついれるプログラム
なので、やっぱり8ビットずつですよね・・・たぶん
571デフォルトの名無しさん:03/04/05 00:41
>569はいってますよ
 int num = 0x11223344;

int は最近の環境では4バイトなのが普通です。

 char a[sizeof(int)];

sizeof(int) は int のサイズを与えます。
つまり、4です。
char は1バイトですので、
ここでは1バイト×4=4バイトの領域を占める配列が作られます。

 memcpy(a, &num, sizeof(a));

これは、&num の指す領域から a の指す領域へ
sizeof(a) バイトだけコピーします。
a のサイズは4バイトなので、
要するに num から a へと情報をコピーします。


memcpy が内部でどういう方法でコピーしているか、
ということは特に規定されていません。
実質的に一般的に使われてるアルゴリズムはあるでしょうが、
昔の環境ならいざ知らず、int が4バイトの環境では
それを考慮しても2バイトずつというのはないですよね。
 char a[2 + sizeof(int)];
 memcpy(a + 2, &num, sizeof(int));
なら2バイトずつになるかもしれませんが...。


マジックナンバーを使わないようにしたり、
サイズが同じでも敢えてデスティネーションのサイズを指定したりと
結構行儀のいいことしてるのに、何でなんでしょ。
>>571
某氏によればそれは悪本だそうです(’’
このすれも悪スレか?
575デフォルトの名無しさん:03/04/05 01:26
>572わかりました。ていねいな解説本当にありがとうございます。
>573そう思います。初心者向けの本のはずなのに、関数の例文に
いろんなこと突っ込んで、もう最悪です。ほかの本やネット講座のわかりやすさ
にびっくりします
576デフォルトの名無しさん:03/04/05 03:51
ポインタのポインタって実務では具体的にどんな事に使われるのですか?
mainの引数とかな。
578デフォルトの名無しさん:03/04/05 03:56
それからポインタのポインタは使用頻度は高いですか?
ポインタ配列を利用するぐらいの頻度かな・・
580デフォルトの名無しさん:03/04/05 05:51
こんにちわ。この板は算数がとくいな人がおおいときいてきました。
10-10-10のこたえを教えてください。よろしくおねがいします。宿題なんです。
まじめです。
>>580
ぬるぽ
1+1=田
1-1=日
10-10-10=?
わかった!
マソコマークかな?
ちょっと不安になったもので質問
memcpy とか memmove, memset などは
malloc などで取得した領域が物理的に連続でなくても
きちんと取得した領域について処理してくれるんですよね?
>>583
そんなOSがこっそりやってる処理まで気にしたら禿げます。
>>584 無性に不安になったので どうもです!
mallocは連続した領域を確保できなかった場合、NULLが返ります。
587デフォルトの名無しさん:03/04/05 06:53
putc('\a',stdout);
とやってもピカピカ光だけで音が出ません。
何ででしょうかね?
バグ?
端末の設定がビジュアルベルになってるのかと。
>588 すげえ。
液晶テレビ「AQUOS」が当たるチャンス
http://camellia16.fc2web.com/gpoint.html
591デフォルトの名無しさん:03/04/05 08:02
数列の100項目が知りたいんですけど
いったいどこがまちがってるかわかりません。

Help!

(初項 1)

#include<stdio.h>

intk;
intA[101];

A[1] = 1;

voidmain()
{

for( k = 2 ; k == 100 ; k++ )
{
A[k] = 2 * A[k-1] + 3;
}

printf("%d",A[100]);

}
592591:03/04/05 08:03
あ・・・
タブって2chじゃ認識されないのね・・・・・
>>591
> for( k = 2 ; k == 100 ; k++ )

これじゃ一度もループしないね。
k < 101
595591:03/04/05 09:11
>>593さん
>>594さん

ありがとう!

だいたい解決しました。

intをlongにかえても29項目までしか計算できませんね・・・・


# cat a.h
static int a(void);

# cat a.c
#include "a.h"
static int a(void)
{
 return 'a';
}

# cat main.c
#include "a.h"
int main(void)
{
 printf("a→%c", a());
 return 0;
}

一体どこがマズイのですかね?
なめてんのか・・・
  ∧_∧
 ( ´∀`)< もうねアホかと馬鹿かと
staticイラネ
system() や popen() でプログラムをバックグラウンドで起動させた時、
そのプログラムのプロセスIDを得る方法はありますでしょうか?
>>600
もしUNIXの話なら、↓で聞くことをすすめる
http://pc2.2ch.net/test/read.cgi/tech/992057422/
>>601
そちらで聞いてみます。どうもありがとうございます。
>>595
 k < 101
は(マジックナンバーが気に食わないけど、せめて)
 k <= 100
の方が意味はわかりやすいかと。

> int k;
> int A[101];
>
> A[1] = 1;
>
この辺りも(せめて)main文の中に入れる、できれば等比級数を求める別に関数を作って
やればもっといいと思われです。

>intをlongにかえても29項目までしか計算できませんね・・・・
多倍長 でぐぐるか?
605標準入出力:03/04/05 11:34
>>1
こんなふざけたスレッド名ならここに質問書く気にならないじゃないか。
質問しなくていいよ、カエレ
>マジックナンバーが気に食わないけど
はぁ? 質問に k == 100 ってあったからマジックナンバー使っただけ。
まあ、k <= 100のほうが分かり易いのは確かだが。
糞質問ばっかじゃねえかボケ!
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>1
今に始まったことじゃないだろ!
  ( `Д´)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V・∀・)/
 (_フ彡        /  ←>>608
610580:03/04/05 16:20
誰かおしえて…
>>596
ルート権限でそんな作業するな
612デフォルトの名無しさん:03/04/05 18:54
#include <stdio.h>

int main(void)
{
int i, ch;

while((ch = getchar()) != EOF)
putchar(ch);

for(i=0; i<10; i++)
printf("ぬるぽ ", i);

return(0);
}
実行すると"ぬるぽ "が3回しか表示されなくて困っています。
なぜなのか教えて下さい。
答えは 10-10-10 == (10-10)-10
演算子の優先順位とか結合方向とかで調べるだ
>>612
printfの引数が変だよ。
>>614
それは本質的な問題ではない。変ではあるが、間違いではない。
>>612
普通に10回出力されるぞ。
取り敢えず
出力をリダイレクトしてみるとか
改行してみるとか
明示的にフラッシュしてみたらどうだ?
616デフォルトの名無しさん:03/04/06 00:25
>>612
>printf("ぬるぽ ", i);
",i"消したら?いらないよ。
>>613
偉そうに間違ってないか?
618612:03/04/06 02:46
レスどうもです。,iは恥ずかしいミスです。
ファイルにリダイレクトすると正常に出力されていました。
また、前に改行を1つ入れると問題無くなります。
しかし、その改行はどこへ消えたのか気になるような…
フラッシュは効果が無い様です。
619612:03/04/06 02:48
環境はwin95, vc++5.0です。
XPで実行してみると問題ありませんでした。
putcharは改行されないから、それに関係あるんじゃない?
詳しいことはわからないけど
構造体のコピーなんですけど
struct hoge{
int a,b
};
main(){
struct hoge h1,h2;
h1.a=3;h1.b=4;

h2=h1;
}
みたいなのはコンパイル通りますか?
memcpyした方がいいんでしょうか?
心配ない、同じ型なら一括代入(コピー)される。
>>621
通りません。memcpyしたらスタックが破壊されます。
ども代入使えると便利です
struct hoge{
int a,b;
};
main(){
struct hoge h1,h2;
h1.a=3;h1.b=4;

h2=h1;
if (h2==h1){
printf("hello");
}
}
比較演算子はさすがにダメみたいですた
>>623

memcpy (&h1,&h2);がダメってこと?
やっぱり
代入はgcc では通ったけど

copyhoge(hoge dest, hoge src){
dest.a=src.a;
dest.b=src.b;
}
とするのが正しいんでしょうか
memcpy (&h1,&h2,sizeof (struct hoge));
だった
>>625 memcpyでも問題ない。
>>623死ね
>>625
ふつー代入します。その方が見やすいでしょ?
#include<stdio.h>
int main()
{printf("ぽ",printf("る",printf("ぬ")));}
630デフォルトの名無しさん:03/04/06 12:40
Cの勉強を初めて間もない者なのですが、
int ch;
while((ch=getchar())!=EOF)
putchar(ch);
って、while文から抜けるにはどうしたらよいのですが?
どこかでEOFは普通-1だと聞いたので、-1と入力してみても抜けられません。
ご教授お願いします。

>>630
UNIXならCtrl+D、WindowsならCtrl+Zで抜けられるんじゃない?
632あぼーん:03/04/06 12:42
   ______________
 /:\.____\
 |: ̄\(∩´∀`) \  <先生!こんなのがありました!
 |:在  |: ̄ ̄ U ̄:|
http://saitama.gasuki.com/aomori/
633あぼーん:03/04/06 12:45
   ,.´ / Vヽヽ
    ! i iノノリ)) 〉
    i l l.´ヮ`ノリ <先生!こんなのがありました!
    l く/_只ヽ    
  | ̄ ̄ ̄ ̄ ̄|
http://muryou.gasuki.com/koumuin/
634630:03/04/06 12:52
>>631
ご回答ありがとうございます。
でもそれだと>>612さんみたいに、抜けたあとに何か出力したい場合は働きませんよね?
それがちゃんと出力されるように抜けたいのですが・・・。
>>634
それはMS-DOSプロンプトのせいでしょ・・・・
main関数の最後にfflush(stdout);を追加しても表示されないならあきらめて。
 アチョーー
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>629
637630:03/04/06 13:19
そうなのですか。
fflush(stdout);を追加してもダメでした。
あきらめるしかないですね。ありがとうございました。
>抜けたあとに何か出力したい場合は働きませんよね?
働きませんよね?ってなにが?
#include <stdio.h>
#include <stdlib.h>
void nu(void);
void ll(void);
void po(void);
int main()
{
atexit(po);
atexit(ll);
atexit(nu);
return 0;
}
void nu(){printf("ぬ");}
void ll(){printf("る");}
void po(){printf("ぽ\n");}
>>617
間違っている所はどこですか?
#include <stdio.h>
#define p (*printf)
#define i if
#define a &&
#define o ||
#define f (int(*)(int))
int main(){
i(p("ぬ","る")o p("ぬ")){i(p("る","の"),0){i(p("ポ")o p("ン")o p("酢","飲んだ"));
}}return (*(f)NULL)(p("もう駄目ぽ"+8));}
getchar()に対して、キーボードなどから「-1」と入力しても
getchar()の戻り値は'-'にしかならない。
EOFを戻らせるためには、入力ストリームをクローズするしかない。
#unixならCtrl-D、DOS系ならCtrl-Zと言うのはクローズするためのキーコード。

で、何故か入力をクローズするとDOS系の場合出力バッファの更新がおかしくなるようだ。
なので対策としては、
・リダイレクトする。
・改行('\n')を挟んでみる。
辺りを試してみてはどうだろう。
それでだめなら、EOFを入力終了の判断に使用せず、
特定のキーコードの組み合わせを終了の判断に使うようにするなどの
仕様の見直しが必要だろう。
643デフォルトの名無しさん:03/04/06 14:45
gccでコンパイルしているのですが
参考書通りにソースを書いてもコンパイル時に
warning: no newline at end of fileという警告が出ます。
これは一体なぜなのでしょうか?
644630:03/04/06 15:02
みなさん色々なご意見ありがとうございます。
とりあえず自分で作ってみました。
#include <stdio.h>

int main(void){
int ch;
char p;

while(1){
if((p=(char)ch=getchar())!='c') putchar(ch);
else break;
}

printf("Hello World.\n");

return 0;
}
このコーティングってマズイでしょうか?
>>643
Cの規格ではソースは改行で終わってなくてはならないから。
・・・だと思う。
int main()
{
>>639::main()
abort();
}
647デフォルトの名無しさん:03/04/06 16:29
  ∧_∧
 ( ´∀`)< ぬるぽ
648デフォルトの名無しさん:03/04/06 17:36
長い文を出力させようとすると
最後のほうしか表示されないのはなんでですか?
>>644
>if((p=(char)ch=getchar())!='c') putchar(ch);
なにがしたいんだかよくわからんのだが、
char pの意味ってあるわけ?

俺ならこう書くな。
while((ch =getchar()) != 'c')
putchar(ch);

ちなみに、関数がcharを返す時は、自動的にintに変換されるので、
型キャストする必要はないはずです。
>>648
前の方のは流れていくから見えないんでしょ?
パイプすりゃよかんべ。

program | more
でよし。
651デフォルトの名無しさん:03/04/06 17:48
>長い文を出力させようとすると
>最後のほうしか表示されないのはなんでですか?
↑これ教えて下さい・・・。
652644:03/04/06 17:49
>>649
すみません。
勝手に''で囲まれた文字はchar型でないと代入出来ないと思っていたので。
自分がしたかったのはwhile文のgetcharからCtrl+zしないで抜けることです。
Hello World.はプログラムを終了せずに抜けたかを確認するためのデバッグライトとしてつけました。
'c'ってCではint型じゃなかった?
654デフォルトの名無しさん:03/04/06 18:03
>>長い文を出力させようとすると
>>最後のほうしか表示されないのはなんでですか?
>↑これ教えて下さい・・・。
お願いします。。


655644:03/04/06 18:07
>>653
いや、確かchar型だったような・・・。
そう言われると断言は出来ませんが。
printf("halo, %s", 2["ABC"]);
printf("halo, %s", "ABC"[2]);
どちらの書き方が一般的ですか?
657デフォルトの名無しさん:03/04/06 18:10
>>>長い文を出力させようとすると
>>>最後のほうしか表示されないのはなんでですか?
>>↑これ教えて下さい・・・。
>お願いします。。
無視しないでおせーてw
>>657
DOS窓で
>実行したいファイル名 | more
ってやればよろし。
>>656
あぼーん
660デフォルトの名無しさん:03/04/06 18:26
>>658
最後に「-- 続く --」
ってなるだけで全部は表示されないけど・・・。
これはしかたのないことなんですか??
661デフォルトの名無しさん:03/04/06 18:29
>>660
リターンを押せば続きが見れます。
>>656
一般的なのはコレ。
printf("halo, C");
>>660
全部を表示するだけの広い表示領域が無かった場合に、どうなれば満足なの?
664デフォルトの名無しさん:03/04/06 18:34
>>661
Thank You!
665デフォルトの名無しさん:03/04/06 18:36
>>663
全部見れれば満足。。
>>656
printf("halo,""2[ABC]");
printf("halo, %s", "ABC");
printf("halo, %s", ABC);
printf("halo, %c", ABC[2]);
などではだめ?
>>650 でずばり正解教えてもらってるのに無視しつつ粘着しまくる厨房度に感服
>>667
禿どう
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>647
永遠に縦に長いディスプレイを買う。
671デフォルトの名無しさん:03/04/06 20:01
>>643さん、解決した?

一番最後の行を改行すればいいんだよ。


main(){

/*hogehoge*/

}/*ここで改行*/
>>670
あの後楽園とかにあるようなどんどん上がっていって一気に下がるやつ。
ああいうので見れるくらい長いのがいいね。
速すぎて読めないってのはナシで。
673643:03/04/06 20:28
>>671
わざわざ心配していただいてありがとうございます。
まだ解決してないんですよー。
プログラムによってその警告が出たり出なかったりなのですが。
改行ってprintf("\n");のことですよね?
674643:03/04/06 20:36
>>671
あ、解決しましたー。
ブロック抜けたあとも空行を1行作れってことだったんですね。
出力関係で改行するのかと思ってました。
どうもありがとうございました。
このスレも落ちたもんだな・・・ボケが!
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>1
http://pc2.2ch.net/test/read.cgi/tech/1048677915/l50
↑ このスレのように、テンプレに↓これが無いからいけないんだ。


あと、ぬるぽに投票してください。
http://pumpkinnet.to/ranking/words/

  ∧_∧
 ( ´∀`)< ぬるぽ
677デフォルトの名無しさん:03/04/07 06:14
long double って宣言するとどうなるの?
doubleとおなじ?

>>677
違う環境もありうる。
double <= long double
679デフォルトの名無しさん:03/04/07 07:24
struct CharaData//0
{
char Name[17];int HP;int MP;//1
}
Chara[8];//2
0は構造体タグ。1はメンバー。2はなんと呼ぶのですか?ある本には構造体名と
書いてあったのですが。2がメンバーのほうが正しい気もしますが。
インスタンス?
なんとなく
2はメンバーではないだろう
struct SMAP
{
int inagaki;
};
たぶん
struct CharaData//0
{
char Name[17];int HP;int MP;//1
};
struct CharaData Chara[8];//2
となるところをいっぺんに書いたんじゃね?
メンバーではないことは確か。
構造体名になるのはtypedef がある場合と思う。
683682:03/04/07 07:54
すまん、型名だった。
684デフォルトの名無しさん:03/04/07 08:28
空のソース突っ込むとエラー返すコンパイラがあるんだが、
そういうもんだっけ?
685684:03/04/07 09:32
言い忘れた。
リンクエラーじゃなくて、コンパイルエラーになる。
「ソースが空です」ってメッセージがでる。
686AGENT-GC:03/04/07 10:58
下らない質問しますが、
現在のMicrosoftの最新のC++コンパイラはなんっすか?
687デフォルトの名無しさん:03/04/07 11:01
>>686
スレ違い。ここはC言語のスレです。
688AGENT-GC:03/04/07 11:04
スレ違い。っつうかC言語とC++はちゃうんかYO!?
C言語のスレだから、という事もあるけど、
MSの製品の事はMS関連のスレなり、MSのサイト覗けYo
>>687
スレ違い。ここはぬるぽのスレです。
691デフォルトの名無しさん:03/04/07 12:46
すみません。どうしてもわからないので御願いします。

C言語にはクラスの概念がないのですが、どうしてですか?
Cだからです。
天然でその質問してるのだとしたら、びびるな。
なぁネタだろ?
VBにもクラスがあるのに。
C言語はVB以下?
Cにもちゃんとクリスはいます。クリスはコーダです。
>>694
クラスの有無が言語の優劣だとでも?
まぁ、まともなプログラミングもできない奴なら言語の優劣を測りたがるのも無理ないか。
ネタはマ板でな
>>694
一応レスしとくと、C いうのはアセンブラの代替としてのシステム記述用に、
簡易・高速・軽量を極めて作られた言語。
その当時にはオブジェクト思考という概念などなく、そしてそのまま仕様が
ANSI でほぼ確定されたわけだ。
微調整した C99 なんてのもあるけど、骨格は昔の C と変わらない。

VB は Microsoft の独自言語で、ANSI 規格と違って拡張しようと思ったらすぐ
拡張できる状況にあったので、新技術を手当たり次第詰めこむ形で成長し、クラス
をも取り入れるに至ったわけだ。
・・・成功してるかどうかは知らないけどね。

クラスも導入したいが C の簡易・高速・軽量性も捨てがたい、と C を袂を分けて
派生したのが C++。

しかし、C++ がこれまたあまりにも節操のない新技術追加が為され、古い機能の廃止
もほとんどしなかったため、とんでもなくややこしい言語になってしまった。
これをもっと簡潔にしよう、というわけでできたのが Java や C#。

今は D も策定中。
Objective-C は無視ですかそうですか。
700698:03/04/07 13:17
>>699
マジレスすると、燃焼系アミノ式。
つーか、漏れが知らないから解説できない。
>>698
つーかD言語は現存するわけですが。
http://www.digitalmars.com/d/index.html
702698:03/04/07 13:39
>>701
・・・リリースされたんですか?
>>702
リリースも何も、digitalmarsが勝手にやっている事だろう。
他のコンパイラメーカは見向きもしない。
>>701
そこのページに言語機能の比較があるんだが、
http://www.digitalmars.com/d/comparison.html

Multiple Inheritance D:No C:No C++:Yes C#:No Java:No


・・・さすがは C++ だ・・・w
705デフォルトの名無しさん:03/04/07 13:57
char *str="hoge=12";
char conf[10], opt[20];

sscanf(str, "%s=%s\n", conf, opt);

で、configファイルを読みたいんですが、
この場合、conf[10]="hoge" で\0が語尾につかないわけですが、
適切な場所に\0をいれるにはどうすればいいですか?
要するにD言語はC#/Javaのネイティブコード版。C++から多重継承と
マクロを取り除いた。それだけ。
>>705
conf[4] = '\0';
>>705
scanfの書式指定は空白文字を区切りと認識するので、
"%s=%s"で"hoge=12"を読むと最初の%sで文字列を全部読んでしまうのでは?

"%s = %s"とか"%[a-z]=%[0-9]"みたいにするか。
何故"%[^=]=%d"じゃないんだろ。
>>709
char opt[]だから。
711705:03/04/07 14:27
なるほど。
参考になりました。
>>708みたいな正規表現も使えるんですね。
ちょっと色々実験してみますね。
正規表現…
713705:03/04/07 14:42
すんません。
今、K&R読み直しました。
別に正規表現というわけじゃないんすね。

質問しておいてなんですが、sscanfはなんか汎用性に欠けるっていうか、
perlみたいな文字列リテラルの扱い方法があるといいんだけど。
Cにそんなもの要求するなよ…。
perl使えC++で文字列クラス使え自前で便利で汎用的な文字列操作関数群を用意しろ禿
716705:03/04/07 15:01
はひ。。。
いま、新しいライブラリ作ってまふ・・・
C言語で多態を実現したいんですけど、どういう風にすればいいでしょうか…。
vtbl もどきを自前で実装する
>>717
「貴様ら!オブジェクト指向を教えろ!! 」に帰れ
lpInterface->lpVtbl->Release(lpInterface);
  ∧_∧
 ( ´∀`)< ぬるぽ
 ホワタァ!
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>721
  ∧_∧
 ( ´∀`)< ぬるぽに聞け!
ハイィィイィ!
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>723
アターーーーーー!!!!!!
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>1
>>717
X Toolkit Intrinsics 読め。
  ∧_∧
 ( ´∀`)< アルセーヌ・ルポンに聞いてちょ
728デフォルトの名無しさん:03/04/07 23:14
windows2000 LSI C-86試食版(C-PAD使用) を使っています。

-----------------------------------------------------------
#include <stdio.h> /*stdio.hファイル宣言*/

int main()
{
short x1,x2; /*符号付きのshort*/
unsigned short y1,y2; /*符号無しのshort*/

x1=-32768;
x2=32767;
printf("x1=%d x2=%d \n",x1,x2);

y1=1;
y2=65535;
printf("y1=%d y2=%d \n",y1,y2);
}
-----------------------------------------------------------

x1= -32768 x2= 32767
y1= 0 y2= 65000
と表示させたいのですが。
x1= -32768 x2= 32767
y1= 1 y2= -1
となってしまいます。
short以外を使ったほうがいいのでしょうか、longを使用したら違う結果が出ました。

レベル低くて申し訳ありませんが、ヒントを頂ければと思います。
>>728
printf("y1=%d y2=%d \n",y1-1,y2-535);
>>728
int を使え。
-1になったのは、桁溢れしたため。
731729:03/04/07 23:25
LSI-Cの試食版のintは16bitだったか・・・
じゃあprintf("y1=%d y2=%u \n",y1-1,y2-535); これで。
hashテーブルを返す関数で
int hash(char *key,int sz){
unsigned char *t=key;
int h;
for(h=0;*t;t++){
h=(128*h+*t)%sz;
}
return 0;
}
というものがあります。
この関数のunsigned char *t=keyというのは、
keyが格納する実引数のアドレスをtに渡しているということなのでしょうか?
また、tをポインタのポインタとして宣言して、この文を記述した場合は
仮引数であるkeyのアドレスを格納を格納出来るのでしょうか?
ご教授お願いします。
733732:03/04/07 23:47
すみません。途中で日本語がめちゃめちゃな箇所がありますが、勘弁してください。
734デフォルトの名無しさん:03/04/07 23:49
外部変数ってプログラム実行中にアドレス変化する?
内部変数は変わるよな・・・
性的変数は変わらない・・・
ということは外部変数も変わらないのか??
>>732
keyの中身をtに入れているだけ。
別の変数に待避しているんだよ。
性的変数ワラタ
>>732
よく考えればわかるぞ。
keyは、アドレス。
*keyは、文字列。

t=key は、アドレスの代入。
つまり、*tは、文字列。

文字列はそれぞれコードを持っている。
例えば、
printf("%d \n", 'a');
とかやってごらん。
>>734
スタックについて考えてみろ。
その前に、まずデバッグして実際に目で追って見ろ!
739728:03/04/08 00:02
>>730
6行目を
unsigned int y1,y2; /*符号無しのint*/
に変更しましたが、結果が一緒でした。

>>729
ありがとうございます、目指す形に出来ました。
y1= 0 y2= 65000 の65000は何故かshortを使うと65000になるみたいな書き方が本にされていたので書いたのですが。
汎用的に使えるようにしたかったためこうなりました。
%uは16bitの数字を表示する書式指定文字列と考えていいのでしょうか。
x1,x2は%dで上手くいっているのは何故でしょうか、あまり気にしなくていいのでしょうか。

-----------------------------------------------------------
#include <stdio.h> /*stdio.hファイル宣言*/

int main()
{
int x1,x2; /*符号付きのint*/
unsigned int y1,y2; /*符号無しのint*/

x1=-32768;
x2=32767;
printf("x1=%d x2=%d \n",x1,x2);

y1=0;
y2=65535;
printf("y1=%u y2=%u \n",y1,y2);
}
-----------------------------------------------------------
「よくわかる最新C言語の基本と仕組み」という本のP74あたりを参考にしているのですが、書いてある通りに書いてもちゃんと動いてないような気がします。
少し古いのでそのせいかもしれませんが・・。
65000は考えられない・・・・
その本もやはり「C言語」か。
742734:03/04/08 00:07
スタックって何の関係があるの?
形しか思い浮かばない・・・
そかデバッグっていう方法があったな!ペコリ~(o_ _)o))
keyはアドレスでいいけど、
*keyを文字列だとは思わない方がいい
>>734
自動変数はスタックに積まれる。
もしくは、レジスタに格納される。
745728:03/04/08 00:10
>>740
やはり誤植っぽいですね。
ありがとうございます、shortって変数なので切り捨てて短くするのかもなんて思っていました・・。
>>739
> %uは16bitの数字を表示する書式指定文字列と考えていいのでしょうか。

違う。符号なし整数(unsigned int)として十進数字列に変換。
747734:03/04/08 00:16
なるほど〜!!
デバッグしてみたら外部変数のアドレス変わらなかったです。
使うときにスタックの↑から取り出すんだ・・・?
なら後に入れればいれるほど早い??ということになるっけ・・

というか・・・ブラウザが変ってなんやねん!
748デフォルトの名無しさん:03/04/08 00:17
o( 〃゜O゜〃)ゝオォーイ!!
後からスタックに積むほうが早いとかじゃなくて、
後から積めば、その関数の仕事が終われば、後に入ったものから順におろされる。

まぁ、メモリを食わないって事になるのかのぉ。
750728:03/04/08 00:25
>>739 様、詳しくありがとうございます。 <(_ _)>
751ERROR:ブラウザ変ですよん。ってなに?:03/04/08 00:29
なるほど〜。
結構Cやってきたけど、あまり内部的なこと考えてなかったです。
考えないといけないですね〜
752732:03/04/08 00:37
>>737,743
なるほどー。
ってことは(128*h+*t)%szの*tってのは、
tに格納されている変数の先頭アドレスが指し示す文字をコードで表し、
それをハッシュテーブル生成に使っているということなのですよね?
それと、コードは本の裏とかに載ってるANSI(ASCll)コード表ってやつが規格なのでしょうか?
753728:03/04/08 01:43
windows2000 LSI C-86試食版(C-PAD使用) を使っています。
-----------------------------------------------
#include <stdio.h> /*stdio.hファイル宣言*/

int main()
{
char x;
char moji1='C';
char moji2='言';
char moji3='語';

x='a';
printf("変数xの中身は %c\n",x);
printf("変数moji1からmoji3を表示します %c",moji1);
printf("%c",moji2);
printf("%c",moji3);
}
-----------------------------------------------

-----------------------------------------------
変数xの中身は a
変数moji1からmoji3を表示します C言語
-----------------------------------------------
と表示されるはずが
-----------------------------------------------
変数xの中身は a
変数moji1からmoji3を表示します Cセ
-----------------------------------------------
と表示されています。
日本語(2バイト)には何か特別な事が必要なのでしょうか。
754ERROR:ブラウザ変ですよん。ってなに?:03/04/08 01:47
言 って漢字だから2Byteじゃん。charは1Byteなんだから
宣言の時は
char moji2[2]="言"
char moji3[2]="語"
ってするべきじゃん?

教え方へたくそでごめん
755デフォルトの名無しさん:03/04/08 01:47
質問です。
ポインタ型で宣言された変数などは必ずmallocとかを使って領域確保しなければいけないのでしょうか?
char *s="Hello World.";
という記述をよく見かけますが、領域確保しなくて大丈夫なのですか?
構造体へのポインタとかだとちゃんと領域確保している場合が多いような気がするのですが。
756ERROR:ブラウザ変ですよん。ってなに?:03/04/08 01:50
へんなもじがあらわれるのは、
"言"を'言'としたために
2Byteから1Byteに減ったためだよ。
2Byte文字をアスキーコードに直したら
0xff 0x12 (適当)のようなもんだから0x12が消えたんかな・・?
757デフォルトの名無しさん:03/04/08 01:53
>755
char *s="Hello World" は
char s[]="Hello World" みたいなもんで
勝手に領域確保してくれる...らしい。
だからプログラム中で領域解放してないでしょ・・・?
758755:03/04/08 01:58
>>757
確かにそうですね。
でも、そうしたら構造体の領域確保はやっぱり疑問が残りますよね。
ノード構造とかしてるプログラムは絶対領域確保してるし・・・。
>>755
"Hello World"と、char *sは分けて考えれ。
・"Hello World"の文字列が確保される。
・*sは、"Hello World"のポインタとして初期化される。
mallocを用いて領域確保(+α)する関数をつくりました
関数に領域を操作するためのポインタを渡しているのですが
初期化されていないポインタを渡すな ゴルァ!! と
怒られます
こういった場合
ポインタの宣言の時にNULLで初期化するのが普通なのでしょうか?
761728:03/04/08 02:06
-----------------------------------------------
#include <stdio.h> /*stdio.hファイル宣言*/
int main()
{
char x;
char moji1='C';
char moji2[2]="言";
char moji3[2]="語";

x='a';
printf("変数xの中身は %c\n",x);
printf("変数moji1からmoji3を表示します %c",moji1);
printf("%c",moji2);
printf("%c",moji3);
}
-----------------------------------------------
としてみましたが

-----------------------------------------------
変数xの中身は a
変数moji1からmoji3を表示します Cxv
-----------------------------------------------
と表示されます・・。
何がいけないのでしょうか。
762755:03/04/08 02:06
>>759
あ、なんとなく分かりました。
文字列リテラルの場合は"Hello World"だけで実体としてメモり確保されるんですね。
でも、構造体の場合はどうなのでしょうか?
理解力がなくて申し訳ないです。
763デフォルトの名無しさん:03/04/08 02:08
char *p;
char *my_malloc();
p=my_malloc();
ってすればいいのでは?
これなら怒られない。
764759:03/04/08 02:09
>>762
構造体でも同じだよ。
765デフォルトの名無しさん:03/04/08 02:09
%cは1Byte表示
2Byte以上なんで%sをつかいましょー
printf("%s",moji2);
>char moji2[2]="言";
danger
767デフォルトの名無しさん:03/04/08 02:12
NULL文字入るんだったね
だからchar moji[3]="言"
というかchar moji[]="言"
がいいかも。コンパイラに任せちゃえ
768755:03/04/08 02:13
>>764
構造体でも実体があれば領域確保しないでよいのですか?
具体的にどういう場合に領域確保をするのかを説明して下さると嬉しいです。
769デフォルトの名無しさん:03/04/08 02:18
764のとおりに、charとかintとして考えればいいじゃん。
charとかintが集まったのが構造体だから。
>>768
可変長配列がほしいときとか
>>768
リンクリストとか何とかツリーとか、基礎的なアルゴリズムを
解説してある本を読むと、ああ、なるほどと思うかも。
772755:03/04/08 02:25
なるほど。
じゃあ必要に応じて拡張していきたい場合は領域確保というような理解でよいのでしょうか?
何度も何度もすみません。
773728:03/04/08 02:31
皆様ありがとうございます。
-----------------------------------------------
#include <stdio.h> /*stdio.hファイル宣言*/
int main()
{
char x;
char moji1='C';
char moji2[3]="言";
char moji3[3]="語";

x='a';
printf("変数xの中身は %c\n",x);
printf("変数moji1からmoji3を表示します %c",moji1);
printf("%s",moji2);
printf("%s",moji3);
}
-----------------------------------------------
で出来ました。
char moji2="言";
でも大丈夫ですね。
下手に指定しない方が失敗が少ないのでしょうか。
char moji2[3]="言";
の場合はnull分余計に一つ確保しておかないといけないんですね。
>>772
そだね。
775755:03/04/08 02:35
>>774
そうですか。どうもありがとうございました。
まだまだ未熟なので、もう1回本を読みあさってみたいと思います。
776660:03/04/08 02:40
>>663
自分には思いつかないアイデアでした
勉強になります
>>773
別にそれでもいいけどさ

char moji[N] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

だった場合、文字数(N)数えるの面倒じゃねえ?
778デフォルトの名無しさん:03/04/08 03:18
char moji2="言";
779728:03/04/08 03:41
>>777
一応下の方に
char moji2="言";
と書いてありますです。
char moji2[]="言";
のほうが無難なのでしょうか、あまり変わらないのかな・・。

たしかに
char moji2[3]="言";
は汎用性が無いので避けていた方が良さそうですね。
wchar wc='ぬ';
で、ちゃんと2ハイ゙ト分保存さるるの?
>char moji2="言";
大丈夫じゃありません。
782デフォルトの名無しさん:03/04/08 07:48
速度が問題にならない場合でも、
関数の引数や戻り値には構造体を使わない方がいいですか?
struct D func(struct D);
よりも、
struct *D func(struct *D);
の方がいいですか?
>>780
wchar_t wc=L'ぬ';
>>782
速度が問題にならないのであれば別にいいんじゃない?
でも、構造体は大抵ポインタで渡すのが普通。

戻り値に構造体のポインタを返すには
その構造体の実体はグローバル変数か、static変数である必要があるので普通はしない

ワイド文字を使うには、まずはロカールを正しく設定しないといけないんじゃない?
ロカール…
んでは、"locale"を“ろかーる”を呼ぶスレを立ててきまつ
ローカレ
(ろけーる + ろーかる) / 2
>>790
いや、単にscaleをスカルと読む人なんだと思うぞ。
>>782
適材適所。
昔のCと違って、構造体を値渡しすること自体に問題はない。
ポインタ渡しでは内容を破壊できるが、それが気になるならconstにすればいい。
793デフォルトの名無しさん:03/04/08 11:48
char str[3];
このstrには"0x123456"が入っています。

このstrに0x123456が入っていると
〜な処理をする。という風にするには
if ((strcmp(str, "0x123456") == 0) {
というにすればよろしいのでしょうか?
それとも、
if ((strcmp(str, "123456") == 0) {
とするものなのでしょうか?

何分初心者で分かり辛い質問かと思いますが
ご教授お願いします。
>>793
>このstrには"0x123456"が入っています。
本当なら確保したメモリからはみ出てます。
よって両者とも間違い。

単に3バイトの整数を比較したいのなら1バイトずつ調べるか4バイトの整数型にキャストしてビット演算とかした方が良いと思う。

795デフォルトの名無しさん:03/04/08 11:53
>>790
ろーくわぁーる
796デフォルトの名無しさん:03/04/08 12:28
MS-DOSプロンプトがアクセサリに無いときは
どうしたら良いんでしょう?OSはMEです。
>>796
ミ田 + R

command
if (str[0] == 0x12 && str[1] == 0x34 && str[2] == 0x56) {
  〜な処理;
}
>>798
エンディアンは大丈夫?
>4バイトの整数型にキャストしてビット演算とかした方が良いと思う。
頭が腐っているのか?
・整数型に直接castすることはできない。
・4バイトアクセスが安全にできる保証はない。
・エンディアン依存になる。
なので、どう考えても1バイトずつ比較するべきだろう。
>>800
エンディアン指摘されて逆ギレ?まぁ、なんにせよ>>800おめ。
>>799
3バイトを比較する段階でエンディアン云々所の騒ぎではないと思う。
>>800
嘘800?
805792:03/04/08 13:31
みなみなさまアリガdございます。
勉強になりますた。
色々ぐぐってみまっす。
>>805
騙るな。
807806:03/04/08 13:40
>>806
騙るな。
黙るな。
>>1のおかげですっかりネタスレになってしまった伝統スレはここですか?
どうせお前らすぐに
Cを捨てて(使いこなせてもいないくせに)
C++>>>C とか
Java>>>C とか言うんだろ?
C>>>Ruby>>>>>>>>>>>C++>>>>>>>>>>>>>>>Java
>>811
それだと parse error before `>' でした。

 int C,Ruby,Java;
 C>Ruby>C++>Java;

だとコンパイルできますた
>>812
未定義
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char ch0;
char ch1;
char ch2;
}INT;

int main(void)
{
int *p;
INT in;

p = malloc(sizeof(char*) * 3);
if ( p == NULL ) {
printf("Memory Error\n");
}
printf("%p\n", &in.ch0);
printf("%p\n", &in.ch1);
printf("%p\n", &in.ch2);
p[0] = (int)&in.ch0;
p[1] = (int)&in.ch1;
p[2] = (int)&in.ch2;

printf("%p\n", p[0]);
printf("%p\n", p[1]);
printf("%p\n", p[2]);
free(p);
return 0;
}
815デフォルトの名無しさん:03/04/08 19:53
突然なんだなんだ?
816デフォルトの名無しさん:03/04/08 19:54
Memory Errorって出力するだけかYO!
mallocで確保した領域をアドレス変数の配列として扱いたいのですが、
確保した領域はアドレス変数じゃないみたいなんですけど、
うまいやり方ありますか。
818デフォルトの名無しさん:03/04/08 19:56
p[0] = (int)&in.ch0;
p[1] = (int)&in.ch1;
p[2] = (int)&in.ch2;

なんでint型にキャストしているんだ?int *の間違いか?
アドレス変数へのポインタにキャストしてアドレス変数を代入しなさい
820818:03/04/08 19:57
それだとpはint *じゃまずいね。int **だね。
int **p;
821デフォルトの名無しさん:03/04/08 20:04
訂正
typedef struct {
int ch0;
int ch1;
int ch2;
}INT;

p[0] = &in.ch0;
p[1] = &in.ch1;
p[2] = &in.ch2;



(22) : warning C4047: '=' : 間接参照のレベルが 'int ' と 'int *' で異なっています。

確保した領域がアドレス変数として確保されればいいんだけど

たんなる変数として確保されているんだよね。

warningなしでスマートにいきたいんですが
>>821
pがint *だからいけないの。int **にする。
823ホント初心者です:03/04/08 20:07
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
float a,b;
a=2.1;
b=3.2;
printf("%f",a%b);
return EXIT_SUCCESS;
}

これもともと整数型だったのをfloatに変えてみたら動かないんですけど、なぜですか?
実数にモジュロ演算子って使えたっけ?
825814:03/04/08 20:12
ありがとう、わかった。
感謝、感謝。
使えない
827823:03/04/08 20:13
>>824
深い意味は無く、
単純に実数だとモジュロ演算はできないって覚えておけばいいのですか?
とりあえず、2.1%3.24はどういう結果に成るべきなんだ?
829823:03/04/08 20:21
>>828
う・・・確かにそうだったw
答えが出せない。
納得しました。アリガト
int**
ってポインタのポインタだよね?
なんか意味あるの?
答えが出せないって事は、fmod みたいのを知りたかったわけじゃないのか。
intだとあまりおいしくないけど、構造体のポインタのポインタは、
構造体をポインタだけで高速にソートしたいときとかに普通に
使われるよ。

どうしてもっていうならポインタを更新したりするパターンで

int realloc_int_array(size_t sz, int **pp)
{
int *p = (int *)realloc(*pp, sizeof(int) * sz);
if (p != NULL) {
*pp = p;
return 0; /* success */
}
return -1; /* fail */
}
>>814>>793か?
いずれにしても、問題をちゃんと整理してから質問しろよ。
int */*****************************/*p;
835デフォルトの名無しさん:03/04/08 23:48
質問があります。
C言語でFANの回転数を取得するアプリを作りたいのですが、
そもそも、FANの回転数をアプリ側から知ることはできますか?
できるならばその方法をご教示ください。
マザーのI/Oのアドレスにアクセスするのでしょうか?
それともOS自体がFANの回転数の情報を保持してたりするのでしょうか?
よろしくお願いします。

836あぼーん:03/04/08 23:49
あぼーん
837デフォルトの名無しさん:03/04/08 23:57
FANにエンコーダつけて、カウンターボードのアドレスを読む
FANの回転数など正確にソフトで読むことは不可能だが、
モーター仕様を調べて電圧をADボードから読めば
ある程度の回転数は解るかも。
1分間で何周回ったか数えてC言語のソフトに入力するのがベストかな
>>835
標準Cにはそんなものありません。
839見習中:03/04/09 00:01
すみません、教えてください。

行列(最大10×10)の固有値を
Cのプログラムで求めたいです。

世には色々な方法がありますが、
ソースが手に入って、精度も良いお勧めの方法を教えてください。
希望をいえば、matlabのeigと同じ精度(欲張ってすみません)

行列要素は、実数です。ただし、対称行列ではありません。
C言語によるアルゴリズム辞典
http://www.matsusaka-u.ac.jp/~okumura/algo/
では、全部実対称行列が対象だった。(泣)

よろしくお願いします。

840835:03/04/09 00:06
>>837
マザーには、温度情報が伝わっているものが多いと思うのですが、
それを読むことはできないでしょうか?
レジスタかなんかのアドレスさえ判ればなんとかなりそうなのですが。
>>840
>>1 は見ましたか?
int n;
printf("FANが回った数を入力してください: ");
if (scanf(" %d", &n) == 1)
printf("FANが%d回、回りました\n", n);
>>839
CLAPACK
844見習中:03/04/09 00:16
>>843さん

CLAPACKってCのソースも手に入るのですか?
>>844
http://www.mscom.or.jp/~tog/anna/
ここら当たりを見れ。
846835:03/04/09 00:21
>>841
すみません、恐らく
標準Cではできない事の質問は使用している開発環境のスレへGo!
で、指摘されていると思うのですが、
標準Cでできると思いますので。。
おそらくioctlかなんかで、レジスタアドレスにアクセスするのですが、
どなたか経験者がいないかと思ったまでです。

全然FANに関係ないのですが、
マルチスレッドプログラムで、共有する外部変数へアクセスするとき、
あるスレッドが外部変数へ書き込みする場合はロックするべきですが、
書き込みが行われない外部変数もロックするべきですか?
(つまり各スレッドから読み出ししか行われない外部変数)
>>839
固有値だけでいいのなら
NUMERICAL RECIPES in C(日本語版アリ)に載ってるよ。
固有ベクトルについては載ってないけど。
849デフォルトの名無しさん:03/04/09 00:29
>>840
FA用PCには温度管理できるマザーもありますが
温度から回転数を計算するためには
回転数とPC内温度と室内温度のグラフを作ってから
推論する必要がありそうですね。(膨大なサンプリングが必要)
どちらにしても、C言語だけでは無理なのです。

>>843
CLAPACK って、FORTRAN の LAPACK を
f2c にかけただけだったような...。
851835:03/04/09 00:33
>>849
そうですか。回転数はやはりアプリからは取得できないっぽいですね。
ありがとうございました。
852見習中:03/04/09 00:34
>>845,847さん
助かります!

http://www.mscom.or.jp/~tog/anna/
みたら、3種類もありました。

一番小さい関数にします(笑)
>>852
非対称行列に使えるのはQR法だけだから気をつけてね。
>>850
その通り。
ソースをどう使うか書いてなかったから、一番手っ取り早い回答しただけ。

実際、俺も同じようにC言語で固有値求めて、DSPに移植した事有ったから、
CLAPACKじゃないソースは持ってんだけど。
さすがにコレは無断で出せないしなぁ
855デフォルトの名無しさん:03/04/09 00:45
>>854
そこをなんとかおねげぇしますだ。
856854:03/04/09 00:48
>>855
会社のマシンに入ってるから、今日は無理。
手元には持ってきとくから、他の方法で解決出来なかったら後日質問して。
857見習中:03/04/09 00:48
>>853
SPECIAL THANX!

そういうことですか!!
危ないところでした。

非対称行列の固有値を求める
場合の方が需要が多いと思うのだけど、
C言語によるアルゴリズム辞典 には対称行列に限定して
話を進めているんですよね。。。

テスト中に、どうしてもmatlabと値が一致しないので、
俺のバグだよなーって全部チェックしたよ。
858854:03/04/09 00:52
>>857
特に固有値の場合、MATLABと結果が一致する事にばかり目を向けないように。
実用上、問題無い場合もある。
最終段階まで演算してみて、グラフとかで確認すべし。
>>857
そこのリンクにある「ダブルQR法」というのにかければ解けます。
お試しあれ。
数学きちんと勉強しなかったから行列って何?って感じなんだよね。  ・・・・・(;_;)
>>857
対称行列に限定したのは多分簡単なヤコビ法を使っているからだろう。
固有値を求めるのは単なる繰り返しによるものだから、キャッシュが
大きいCPUの方が速く求まる。
862見習中:03/04/09 01:32
>>858、859、861さんどうも有難うです。

固有値を任意に移動するルーチンを作ったので、
確認のために、固有値を表示させようという意図で
作っていたんです。だから、なるべく、matlabと同じでないと
説得力がないんですよ〜。

「ダブルQR法」ためしてみますね。
863見習中:03/04/09 01:46
しゅ、収束しない(泣)

A={ 5 8 3 6 ; 2 9 4 1 9 9 8 3 ; 6 2 1 5]

だめだぁ。
864854:03/04/09 01:53
>>862
MATLABと同じ結果が欲しいならCLAPACK。
CLAPACKは、LAPACK(FORTRANで作られた物)をC言語に変換したもの。
MATLABで採用されているのはLAPACK。
FORTRANから変換されたものなので、使い方に癖は有るけど。
865見習中:03/04/09 01:59
854さん、今clapack.tgzを落としています。
これってソースが参照できるのですか?

当方 ダイアルアップ。30分は掛かりそう。
866854:03/04/09 02:05
>>865
ソースは当然入っています。 大 量 に 。
がんばって、ぐぐって下さい。
846 のような阿呆が出てこないように、もうちっとテンプレ練った方がいいな
テンプレ変えれば解決すると思える誰かさんは双頭な低脳だな
869見習中:03/04/09 02:19
854さん ありがとう!

やってみます。
アドバイスありがとうです!
>>867
846が阿呆ってのは禿同だが、上級者なら適切に理由述べて、適切に誘導すべし。
テンプレ見て理解出来るなら、このスレにゃ書かねーわな。
871かおりん祭り:03/04/09 02:42
http://saitama.gasuki.com/kaorin/
〜oノハヽo〜 / ̄ ̄ ̄ ̄ ̄ ̄ ̄                
  ( ^▽^) < こんなのがございまーす♪ 
= ⊂   )   \_______
= (__/"(__) トテテテ...
872あぼーん:03/04/09 02:42
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>871,872
874あぼーん:03/04/09 10:51
http://saitama.gasuki.com/kaorin/
  ( `Д´)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V・∀・)/
 (_フ彡        /  ←>>873
875あぼーん:03/04/09 11:13
あぼーん
876デフォルトの名無しさん:03/04/09 18:17
#define begin {
#define end }
ってやっておいて使うと、
ソースの見た目がスマートになっていいんだけど、
なんでみんな嫌うの?
とりあえず生き埋めだな
かえって煩わしいよ。
{}はシンプルにして直感的だしタイピングも楽だ。
Cに慣れていればbegin-endブロックがスマートとは思えないんですが
880デフォルトの名無しさん:03/04/09 18:33
>>879
視野が狭いんですね。
>>876

if(a) begin
...
}

if(a) {
...
end

でもコンパイルエラーが出ませんし、
エディタの自動字下げ機能が働かなくなりますが、何か?
ちゅーか、C言語スレでナニイッテンノ?
>>882
C言語ではないと?
C++ のテンプレートライブラリみたいに、マクロガリガリで組んだ
ライブラリなんてないんだろうか。

まぁそれはおいといて、言語の文法を弄ってしまうようなマクロは
避けた方がいいんじゃないだろうか。
#define unless(b) if(!(b))
#define until(b) while(!(b))

とかもだめ?
駄目なものはダメ。
Perl等でもunlessなんか使うなよ。
887885:03/04/09 19:04
>>886
いつもそう言われるので俺は使っちゃいないが、
unless と until を使わない納得いく理由は未だに聞いたこと無い。
有名な言語で実装されてるのに、そこまで敬遠する理由は何?
884に大体同意かな >文法云々
それにif/unless、while/untilなど、真・偽の動作が逆転した表記が混在するのは鬱陶しいと思う。
889885:03/04/09 19:17
確かに2通りの書き方の両方で同じ動作をするというのも
紛らわしいことがあるのかもしれないな。
if を選んだか、unless を選んだかに意味が持たせられるが、
意味を考えずに書いたりしたコードでは混乱する原因にもなるか。

オーケイ。これからも使わないよ。
そんなコードのデバッグがまわってきたら、何が何でも探し出して
小一時間問い詰めたい。
エディタの色分けもきかんし(設定かえろというのか?)。
891884:03/04/09 19:20
>>887
俺は単純に、C 言語では同じ方法を実現するものは一つであるほうがイイと思う。
単純に可読性が落ちるし。初心者がポインタと配列を混同するのがイイ例だ。
単純に入門書が糞なものが多いというのもあるが。

Perl はうろ覚えなんだが、たしか if (a != b) も unless (a == b) も同じだよな?
  unless(a == b): a と b は等し…くない
  if (a != b): a と b は等しくない(キッパリ
…の方がイイと思うな。少なくとも俺はコードから脳内妄想に変換する時に楽だ。

Perl は一つの事をするのにいくつかの方法を差し出すのが言語の思想だろう。
unless や until があるのもそのせいかと。
文法の特徴にも言語の思想は出ると思うよ。begin/end にしても、実用性重視の
C がブレースを選択したのは至極当然だろう。だってタイプが面倒だもん。

…こんなもんでどうだい。俺の解釈だけど。
892884:03/04/09 19:21
あぁ、他人と喋りながら文章書いたから、なんだかタケーシな内容になってるな…。
適当に文法を修正して読んでくれ。
perlだとif、unlessすらあまり使わず済ますんで
a == b and &foo;
a != b or &bar;
とか、もう書いてる時点でも何だか分からなくなる(w
>>890
VCのユーザ定義キーワードは便利だぞ。

>>891
「ちょっと長めの条件の否定」を使う場合に、
ネストが減って見やすいというのはありますえ。
あと、unless(isdigit(ch)) とか。
895884:03/04/09 19:29
>>894
> VCのユーザ定義キーワードは便利だぞ。
む…こんな機能あったのか。ていうか、何のために使うんだ?まさか M$ の人間は
>>876 みたいな事を?…中の人も大変だな。

> 「ちょっと長めの条件の否定」を使う場合に、
むぅ、これは盲点。たしかにそうかもしれんが…否定演算子があるのに文法まで
いじる必要はあるんだろうか、とも思う。

まぁぶっちゃけ好みの問題だろ。
size_tとかをキーワードにするんじゃねーの?
マクロが華の LISPer はどういう意見を持ってるのか気になるところだ。

>>895
>ユーザ定義キーワード
特定のトークンに色を付けられる機能。
VC の exe と同じところに USERTYPE.DAT というファイルを作り、
その中にキーワードを列挙するだけという適当な実装方法が泣けるが、
まぁ設定のバックアップがとりやすいのは良い。
色はオプションで変えられる。

小文字の標準マクロ(offsetof など)とか、
WORD, size_t みたいな基本型みたいなもんでよく使うのに
typedef してるがために色のつかない型とか、
ちょっと強調したいのに色を付けるのに使える。
マクロのインテリセンスの無い VC6 での
スペルチェックにもなるかも。
一応普通のキーワードとは色を変えとくが吉。
>>897
> VC の exe と同じところに USERTYPE.DAT というファイルを作り、

そのファイルをつくるためのフォームはないんですか?(泣
.NET ではどうなったんだろうねぇ。
ユーザ定義キーワード。
使いやすくなってんのかな。
まだ試したこと無いや。
おーできたできた。
msdev.exe(Developer Studio)と同じところに置くのね。
902デフォルトの名無しさん:03/04/09 21:06
2次元配列を引数で渡す方法について教えてください

a()
{
char data[10][10];
 ・
 ・
 b(data);
 ・
 ・
}
b(char get[10][10])
{
 ・・
 x=get[2][2];
 ・・
}

これで合ってますか?
もし、合ってるとしたら、これは a側で作られたエリアを参照していることになるのでしょうか?
どうかごきょーじゅよろしくお願いします。
>>902
あっている。
>>903
ありがと
>>903
トン
>>903
アリガトウおおお

 凸  凸
   凸
  凸
凹凹凹凹凹
>>903
908姫様をお助けしろ!:03/04/10 01:00
 □□■Ω■□□
 □□■■■□□
 □□□ □□□
 □□  □□□

   ゜
   ━
909デフォルトの名無しさん:03/04/10 04:37
CでマザーボードのBIOSの種類やバージョンを
調べることが出来るでしょうか?

>>909
標準Cでは無理
911デフォルトの名無しさん:03/04/10 06:19
戻り値をchar*にしようとすると、「ローカル変数またはテンポラリのアドレスを返します。」
と警告が出ます。ポインタを返すにはどうすればいいですか。
912かおりん祭り:03/04/10 06:20
http://www.saitama.gasuki.com/kaorin/
       こんなのございま−す♪
       ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        〜oノハヽo〜
  ,.-''"¨ ̄●`' ‐(^▽^)
 (,,●i,,,i,,,,,,,,i,,,,●),,)⊂ )
    )  (    || |   
    ( ^▽^)  (_(__)
~~~~~  ̄ ̄ ~~~~~    ~~~~~
913あぼーん:03/04/10 06:20
914あぼーん:03/04/10 06:20
あぼーん
915佐々木健介:03/04/10 06:20
     ______
    /_      |
    /. \ ̄ ̄ ̄ ̄|
  /  /  ― ― |
  |  /    -  - |
  ||| (5      > |
 | | |     ┏━┓|   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |     ┃─┃|  < こんなサイトを見つけた
|| | | |  \ ┃  ┃/    \  正直、スマンカッタ
| || | |    ̄         \_________
http://saitama.gasuki.com/kensuke/
>>911
そのエラー内容だとなんか
自動変数のアドレスを返しているみたいだが?
917911:03/04/10 07:08
>>916 ?。コードはこんな感じなのですが。
char*CountTime(long miriByou)
{
long mB=miriByou;char s[11];int a;
sprintf(s,"%1d~%2d'%2d\"%2d",mB/3600000,mB%3600000/60000,mB%60000/1000,mB%1000/10);
for(a=0;a<=9;a++)if(s[a]==' ')s[a]='0';
return s;
}
>>917
char s[11]の存在は関数CountTime内のみ保証する一時的なもの。
だからそんなオブジェクトへのポインタを戻り値にして
使用すべきではない、という警告

君はCの基礎学習が必要や
91929:03/04/10 07:44
>>917
とりあえず static char s[11];
としてみ。

sprintfの中の人も大変だな。
>>917
普通はそのような目的ではchar*を戻り値にしない。
#include <stdio.h>

void CountTime(long miriByou, char s[11]);

int main( void )
{
char str[11];
CountTime(1500, str);
printf("%s\n",str);
return 0;
}

void CountTime(long miriByou, char s[11])
{
long mB=miriByou;
int a;

sprintf(s,"%1d~%2d'%2d\"%2d",mB/3600000,mB%3600000/60000,mB%60000/1000,mB%1000/10);
for(a=0;a<=9;a++)if(s[a]==' ')s[a]='0';
}

バッファの先頭アドレスを渡す
>>909
標準Cでも出来るけど、かえって面倒だよ。
>>922
ソースキボン
>>921
まあ同じことだが
void CountTime(long miriByou, char s[]); の方がいい。
C99-IIはこういう仕様にしようよ。

#include <stdio.h>
int main()
begin
 (*printf)("hello, C99-II");
end
またオマエか…
>>925
要望スレじゃないYO、質問してください。
マ板に「C99-IIを作ろう」スレでも立てて引きこもってろ
929デフォルトの名無しさん:03/04/10 10:21
ちょっと質問。
仮引数でのchar s[] は char *sと同じになるってことでいい?
930917:03/04/10 10:24
お答えありがとうございました。
>>918 警告が出ても思ったとおりの結果になることがあったので、
キャストとかをすれば大丈夫かと思ったのですが。
>>919 警告無しにできましたが、以下のソースでは失敗してしまいます。
>>920 どのような時に使うのですか。
>>921 参照渡しですよね。やはりこのやり方がいいのですかね。
一文で書けるといいかなと思ったのでポインタ返しを試みたのですが。

getch()+エスケープシーケンスですがコードです。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1003826049&res=59
>>930
>どのような時に使うのですか

受け取ったバッファの特定のアドレスを教えたい時とか・・
>>930
一文で書けると確かにいいだろうけど
他の関数が軒並み戻り値ではなく引数にchar*を受け取るのはなぜかを考えてくれ。
> for(;pro<=36000000&&cnt<=60;)

while使えばいいのに。
>>929
イイヨ、イイヨ〜
規約でwhileとdoとswitchは禁止されていますです。
>sprintf(s,"%1d~%2d'%2d\"%2d",mB/3600000,mB%3600000/60000,mB%60000/1000,mB%1000/10);
>for(a=0;a<=9;a++)if(s[a]==' ')s[a]='0';

sprintf(s, "%1d~%02d'%02d\"%02d", // 以下略
>警告無しにできましたが、以下のソースでは失敗してしまいます。

どう失敗したかくらいは書こう。
で、staticの意味くらい調べよう。
staticで確保した領域はただ一つしかないから、二度目の呼び出しで
上書きされてしまう。そのソースの使い方なら、呼び出し元で
別領域にコピーしておく必要がある。
一文で書けるぞ。
#include <stdio.h>

char *CountTime(long miriByou, char s[]);

int main(int argc, char **argv)
{
 char tmpBuf1[11], tmpBuf2[11];
 printf("%s, %s\n", CountTime(1000, tmpBuf1), countTime(1500, tmpBuf2));
 return 0;
}

char *CountTime(long miriByou, char s[])
{
 long mB=miriByou;

 sprintf(s,"%1d~%02d'%02d\"%02d",mB/3600000,mB%3600000/60000,mB%60000/1000,mB%1000/10);
 return s;
}
939デフォルトの名無しさん:03/04/10 11:44
>>938
char *CountTime(long miriByou, char s[])
これを
char *CountTime(long miriByou, char *s)
これにしても一緒?
>>939
一緒。
>>938
char *CountTime(long miriByou, char s[])
これを
char *CountTime(long int miriByou, char s[])
これにしても一緒?
>>941
一緒。

さぁ次は何かなw
943917:03/04/10 12:33
お答えありがとうございました。
>>936 初めて知りました。
>>937 時間を表示する所に ・E と表示されました。
>>938 できますね。戻り値を使用するのは警告のと同じですが、
戻り値用のアドレスを指定しているので、しっかり動くのですか?
>>943=917
関数の戻り値であるポインタは、呼び出し元が確保した配列を指している。
なので、問題がない。

最初のように、呼び出された関数内で定義された自動配列は
呼び出し元に戻るときに破棄されるので参照してはいけない。

staticな自動配列を使った場合は、その配列自体は保証されるが
呼出しごとに破壊されるので呼び出し元での取り扱いに注意が必要。
945909:03/04/10 14:47
>>922
詳細キボン
946デフォルトの名無しさん:03/04/10 14:52
ぬるぽって0なの?
 ヒミツヲバラシタナ…!
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>946
948917:03/04/10 15:53
>>944 分かりました。ありがとうございました。
呼出しごとに破壊されるってどうゆうこと?
>>949
呼び出すたびに別の値で上書きされるってこと
951デフォルトの名無しさん:03/04/10 18:37
double形の一桁目を抜き出すにはどうしたらいいですか?

int形だったら
int i = 2147483647;
return i % 10;
って出来たのですが

double d = 4294967295;
return d % 10;
だと(error C2296: '%' : 不正な左オペランドです。)がでるんです。
952デフォルトの名無しさん:03/04/10 18:39
intにキャストして10で割った余りを得る。
0.001234 の一桁目を同扱えばよいのか言ってみろゴラア
>>953
ぬるぽ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>953-954
キサマトイウヤシハ
 ショウコリモナク
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>956
>>952
ダメ。桁数が大きい場合にワヤになる。
fmod で余りを求めてから fabs で絶対値をとって
floor で小数点以下を切り捨てる。
959952:03/04/10 19:03
>>958
やっぱりつっこまれたよー ウワァァァン`Д´)/
960デフォルトの名無しさん:03/04/10 20:02
>>958
long doubleだった場合もそれでいけますか?
floor とか fmod って double を引数に取るみたいなので
long double ではまた別の方法を使う必要があります?
961デフォルトの名無しさん:03/04/10 20:05
なぁ
doubleとかって表現できる桁数<<<<有効桁数だから
一桁目が何の意味も成さないことが多いんじゃないのか?
逆やねん
表現できる桁数>>>>有効桁数
チョト違った
表現できる桁数>>><有効桁数
965デフォルトの名無しさん:03/04/10 22:56
2つの6000行9列のファイルを読み込み、それぞれの要素を
割って比を求め、その値をファイルに出力させるプログラムを
書いてみて&教えてください。
>>965
日本語を正しく書いて下さい。
>>965
いやでつ
scanf や fgets くらいは知っているのだろうか
>>968
それ知ってたら、あとはループと、小学校レベルの四則演算だけだと思うが・・・
970デフォルトの名無しさん:03/04/10 23:36
データ数だけ配列準備?
エクセル使ったら一発じゃねーの?
データを配列に読み込ませるところで苦労してるんじゃない?

そんな単純計算はCを使わないほうが簡単そうだ。
今回は awk とか perl がうさげ?
データ区切りについて何も書いてないけど、965は問題理解してないってこと?
965大人気だな。
for文で挫折しました。
countってナンだよ!!
C言語って覚えてナンの意味があるんですか?
なんかCは終わりとか言われてますけど。
覚えられなかった人が言うんだよ。
>>977
習得の意義が思いつかないなら
別に覚えなくてもいいんじゃないか
とりあえず間に合ってるってことだろう

意味があると思うことをやればいい
10列でスペース区切りのデータファイルを配列に
読み込ませたいのですが、どうすればいいの?
>>980
fgetsで1行読みこむ
strtok(デリミターをスペース), atoi やらで
strtokがNULLを返すまで配列に格納する

これを10回繰り返す。
>>977にとって意味があろうと無かろうと
知ったこっちゃないが、必要になったら習得すれば?
ちょっとスレ違いですが
最近割り算のコストが、結構高いことに気付きました。
そこで もし double a,b; で

for(〜) a=a/b;

と言うのを

b=1/b;
for(〜) a=a*b;

としたらいいじゃんと思ったのですが
問題はありますかね?
>>983
実測して速度と結果を見るしかないんじゃない?
vc++ std でためしたら大体6〜7割の時間で処理しています
stdなのであまり最適化されないせいかも知れませんが。

でもやはり扱う数の大小によっては結果の精度に問題が生じますね。
そんだけです。なんか変な質問ですみませんでした。
986デフォルトの名無しさん:03/04/11 18:44
川 ‘〜‘)||<ぬるぬる

川〃‘〜‘)||<ぽっ
速度稼ぐのなら、浮動小数点使わずにすます方向も考えてみる
>>983
コンパイラによってはそういう最適化をすることもある。
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/
 (_フ彡        /  ←>>986

990デフォルトの名無しさん:03/04/11 20:10
>>980
マルチ氏ねマルチ氏ねマルチ氏ね

  ∧_∧    char* pbuf = (char*)malloc(SIZEOF_MY_ARRAY);
 ( ´∀`)< if(pbuf == ぬるぽ) {


  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/ < return だめぽ;
 (_フ彡        /

}

る  
やめた  
995デフォルトの名無しさん:03/04/11 23:06


    ノノノハヽ
   (●´ー`)ハハヽゞ デヘヘ
    ノ つ⊂(´▽`∬∬、
   (__´⌒)⌒)、,,, U)つ
┌┬┬┬┬┬┬┬┐
├┼┼┼┼┼┼┼┤
├┼┼●┼┼┼┼┤ ●〜┐
├┼┼┼┼┼┼┼┤    ●
├●┼┼┼┼○┼┤ ○〜〜〜〜○
├┼┼┼┼●┼┼┤
├┼┼┼┼┼┼┼┤
├┼┼┼┼┼┼┼┤
└┴┴┴┴┴┴┴┘ ○
●○           |
   ○┐   ●〜〜┘
     ●
  | M ヽ
  |从 リ)〉
  |゚ ヮ゚ノ| キタ…
  ⊂)} i !
  |_/ヽ|」
  |' 
         ┏      ┓ ぬる
      >>1    ∧_∧ / ̄ ̄ ̄ ̄
        ̄ ̄\ ( ´∀`)
          (    )   ぽ
          | | | / ̄ ̄ ̄ ̄ ̄
          (__)_)
        ┗      ┛
999デフォルトの名無しさん:03/04/11 23:10
999
1000?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。