C言語なら俺に聞け! Part 109

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。
質問する前には最低限検索を。

GUIなどの標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。

エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。

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

C言語なら俺に聞け! Part 108
http://pc8.2ch.net/test/read.cgi/tech/1117690676/

他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
2デフォルトの名無しさん:2005/06/22(水) 19:27:53
前スレ埋まっちゃったなぁ
3デフォルトの名無しさん:2005/06/22(水) 19:48:51
pthread について質問です。
pthread_cleanup_push によってクリーンアップハンドラを登録します。
そのクリーンアップハンドラの中で、さらに pthread_cleanup_push を呼び出すことは許されるのでしょうか。

というのは、確保したリソースをクリーンアップハンドラで解放したいのですが、この解放処理に排他制御が
必要なのです。
排他処理には mutex を使っているのですが、pthread_mutex_lock の前に pthread_cleanup_push を行って
pthread_mutex_unlock を登録しているのです。
いかがなものでしょうか?
4デフォルトの名無しさん:2005/06/22(水) 19:49:56
>>3
>>1 標準Cではできない事の質問は使用している開発環境のスレへGo! (←ここ注目)
53:2005/06/22(水) 19:57:59
>>4
おっと、失礼しました。
と言っても、pthread はどこのスレに行けばいいんですかね?
開発環境は vi で書いて gcc でコンパイルしてるんですが、GNU ってことでもないし・・・
もしよろしければ、道案内していただけれると助かります。
63:2005/06/22(水) 20:01:01
たびたびすみません。
 マルチスレッドプログラミング相談室 その3
 http://pc8.2ch.net/test/read.cgi/tech/1098268137/l50
を発見しました。
お騒がせしました。
7デフォルトの名無しさん:2005/06/22(水) 21:10:32
>>5-6=3
何故、質問誘導スレに行くと言う発想が出ないんだ?
8デフォルトの名無しさん:2005/06/22(水) 22:17:59
>>1 にぬるぽが無いからいけないんだよ。
9デフォルトの名無しさん:2005/06/22(水) 22:47:59
>>8 にガッ!が無いからいけないんだよ。
10デフォルトの名無しさん:2005/06/22(水) 22:56:03
10
11デフォルトの名無しさん:2005/06/22(水) 22:57:58
早速質問です><
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
何卒、ご指導の程よろしくお願いしますm(_ _)m
12デフォルトの名無しさん:2005/06/22(水) 23:00:00
>>11
始めたばかりの人間にはわからないような場面で役に立つ。
13デフォルトの名無しさん:2005/06/22(水) 23:01:23
>>11
ビットシフトするの時に役に立つ
14デフォルトの名無しさん:2005/06/22(水) 23:20:10
Cスレ風物詩となっちゃってるよ…
15デフォルトの名無しさん:2005/06/22(水) 23:20:42
ファイルのディレクトリ選択をしたいのですが、もっと効率のいい方法を教えてください。

int main(void)
{
FILE *a;
int dir;
char fname[64],*str;
char buf0[256]="C:\\Documents and Settings\\Dai\\My Documents\\C\\";
char buf1[256]="C:\\Documents and Settings\\Dai\\My Documents\\C\\test\\";
printf("どこに作成しますか?\n(0:C 1:test)\n--->");
scanf("%d",&dir);
if(dir==0){
str=buf0;
}
else if(dir==1){
str=buf1;
}
printf("ファイル名を入力\n--->");
scanf("%s",fname);
strcat(str,fname);
if((a=fopen(str,"w"))==NULL){
printf("Can't open\n");
return 1;
}
fclose(a);
printf("終了〜( ´∀`)\n");
return 0;
}
16デフォルトの名無しさん:2005/06/22(水) 23:30:11
>>15
効率って、どんな点での話をしてるの?
バッファを 2個も取って、メモリの利用効率が悪いから改善したいって話?
それとも、もっとお手軽な関数は無いのかって話?

細かいことだけど、そのコード dir が 0 でも 1 でもなかったら str が不定になって、具合悪いよ。

17デフォルトの名無しさん:2005/06/22(水) 23:31:11
つうか環境依存なカテゴリーなんだが。
1815:2005/06/22(水) 23:36:03
>>16
すいません。

・バッファをなるべく減らしたい
・ポインタよりも効率のいい方法はないか
・ifの部分をもっと改善できないか
という点について教えていただきたいのです
あくまで「ディレクトリ選択」が目的なので例外処理は後回しです。
19デフォルトの名無しさん:2005/06/22(水) 23:38:46
>>15
よぉ!大!久しぶりだな
20デフォルトの名無しさん:2005/06/22(水) 23:42:03
>>19
ディレクトリそのまま出さなきゃよかった。。。orz
21デフォルトの名無しさん:2005/06/22(水) 23:47:30
>>18  バッファを一個にして、さらにスコープを細かく区切ってスタックの使用量を減らしてみた。

 char buf[256] = "";
 char *str = buf;
 {
  const char dirname = NULL;
  do {
   int dir;
   printf("どこに作成しますか?\n(0:C 1:test)\n--->");
   scanf("%d", &dir);
   if(dir == 0) {
    dirname = "C:\\Documents and Settings\\Dai\\My Documents\\C\\";
   }
   else if(dir == 1) {
    dirname = "C:\\Documents and Settings\\Dai\\My Documents\\C\\test\\";
   }
  } while(dirname == NULL);
  str += sprintf(str, "%s", dirname);
 }
 printf("ファイル名を入力\n--->");
 scanf("%s",str);
 {
  FILE *a;
  if((a = fopen(str, "w")) == NULL) {
   printf("Can't open\n");
   return 1;
  }
  fclose(a);
 }
 printf("終了〜( ´∀`)\n");
 return 0;
2221:2005/06/22(水) 23:49:46
まちがった
× const char dirname = NULL;
○ const char *dirname = NULL;
2321:2005/06/22(水) 23:51:57
さらに間違ってた・・・
× if((a = fopen(str, "w")) == NULL) {
○ if((a = fopen(buf, "w")) == NULL) {

ショボいソースなのに何度も書き込むハメになって・・・
もうダメだ・・・
2415:2005/06/22(水) 23:59:23
>>21
ありがとうございます。
sprintfとconstはまだ勉強してないのでこれから調べます
25デフォルトの名無しさん:2005/06/23(木) 00:02:08
>>15
int main(void) 

    FILE *a; 
    int dir; 
    char fname[2][256]={"C:\\Documents and Settings\\Dai\\My Documents\\C\\", 
        "C:\\Documents and Settings\\Dai\\My Documents\\C\\test\\"};
    printf("どこに作成しますか?\n(0:C 1:test)\n--->"); 
    scanf("%d",&dir); 
    printf("ファイル名を入力\n--->"); 
    scanf("%s",fname[dir] + strlen(fname[dir])); 
    if((a=fopen(fname[dir],"w"))==NULL){ 
        printf("Can't open\n"); 
        return 1; 
    } 
    fclose(a); 
    printf("終了〜( ´∀`)\n"); 
    return 0; 
2615:2005/06/23(木) 00:09:35
>>25
おお
これならifも省けますね!
二次元配列を使う発想やstrlenの使い方も私の頭にはなかったです。
ありがとうございました。
27デフォルトの名無しさん:2005/06/23(木) 00:11:32
>>25-26
dirが配列の範囲内かどうかのチェックをしないと駄目だろ。
2815:2005/06/23(木) 00:18:18
>>27
例外処理はelseなりwhileなりでできるので後回しなんです。
29デフォルトの名無しさん:2005/06/23(木) 00:49:43
>>26
バッファを減らすという課題がクリアできてないね。
行数が減ればOK?
3015:2005/06/23(木) 00:54:22
>>29
>>21さんと>>25さんのプログラムを参考に、両立できるようがんばってみます

ちなみに私的には
バッファ<単純化(≒行数削減)
です
31デフォルトの名無しさん:2005/06/23(木) 01:20:01
どんな長さのディレクトリ名でも256バイト確保ちゃってるのはどうかと

char *dir_list[2]={
"C:\\hoge\\",
"C:\\hoge\\hage\\"
}

てな感じにしといて、
ファイル名と結合する為の専用バッファを1つ使うとメモリは減らせる
でも、文字列コピーになるので、処理は重くなる
32デフォルトの名無しさん:2005/06/23(木) 01:39:34
>>31
>>25 みたいに最初からバッファに展開しておくのだって、内部的にはバッファ上に文字列をせっせと作ってるわけだから、
そんなに軽い処理じゃないっしょ。
しかもデータ領域もコード領域も肥大化して、メモリ効率があんまり良くない。

処理系依存の話になるけど、linux に入ってた gcc で最初から文字列をバッファ上に展開しておく方のサンプルを
コンパイルしてアセンブラソースを吐かせてみると、オリジナルの文字列をデータ領域に持ちつつ、関数の入り口で
4バイト単位でスタック上に文字列をコピーがずらずら並んでて、さらにバッファの後ろを 0 でクリアする処理になってる。
mov がひたすら直列展開されてるからスピードは遅くはないんだろうけど。
33デフォルトの名無しさん:2005/06/23(木) 01:47:10
そのコピーを無くしたいんなら、>>25でいうfname[][]を
単にstaticな配列にしておけばいいだけ

しかしみみっちい、つかどうでもいい話しとるな。
3432:2005/06/23(木) 01:53:59
>>33
そうすると
scanf("%s",fname[dir] + strlen(fname[dir]));
がいやな感じになりそう。
一度きりの実行ならいいけど、何度も呼ばれる関数だとダメだよね。

つか、みみっちい話なのには同意。
でも >>32
>でも、文字列コピーになるので、処理は重くなる
についてのコメント
35デフォルトの名無しさん:2005/06/23(木) 01:55:09
器が小さいからね。
36デフォルトの名無しさん:2005/06/23(木) 06:37:01
もともと >>15 の質問が「効率の良い方法教えて」
だったからね。
37デフォルトの名無しさん:2005/06/23(木) 10:55:01
いきずまってます、助けてください。

2つの文字列(20文字以内)をキーボードから入力し、1つの配列にし、
printf関数の%sによって表示するプログラムを作成しなさい。(ポインタを使うこと)

[実行例]
str1 : Big
str2 : City
str3 : BigCity



38デフォルトの名無しさん:2005/06/23(木) 11:05:38
>>37
>>1を読め
39デフォルトの名無しさん:2005/06/23(木) 11:38:03
>>37
#include <stdio.h>

int main()
{
    printf("マルチ氏ね"
    return 0;
}
40デフォルトの名無しさん:2005/06/23(木) 11:40:11
>>39
エラーが出るんですが。
41デフォルトの名無しさん:2005/06/23(木) 11:55:32
char ary [] = {1, 2, 3, 4}
int a;

int形のaに整数型でaryを連結したものを入れるにはどうすればいいのでしょうか?
a = 1234
のようになるようにしたいんです。
42デフォルトの名無しさん:2005/06/23(木) 12:03:47
a = ary[0] * 1000 + ary[1] * 100 + ary[2] * 10 + ary[3];
43デフォルトの名無しさん:2005/06/23(木) 12:28:29
>>42
なるほど、ありがとうございました。
44デフォルトの名無しさん:2005/06/23(木) 15:15:43
x = 0;
for(i=0; i<4; x=x*10+ary[i++]);
45デフォルトの名無しさん:2005/06/23(木) 16:33:36
なんでわざわざ x=0 を外に出すのか
46デフォルトの名無しさん:2005/06/23(木) 17:19:56
Cでcsvを使って大量にデータを扱うプログラムを書かないといけないのですが、




とデータを一度書き込んだ後
●○
●○
●○
●○
と横にデータをつけ加えていく方法はあるのでしょうか?
47デフォルトの名無しさん:2005/06/23(木) 17:22:13
>>46
何がわからないんだ?ファイルに○を挿入したいの?
48デフォルトの名無しさん:2005/06/23(木) 17:24:17
>>46
読んで書いていくしかないと思うよ
最初から○分の隙間をあけてあればよかったけど
49デフォルトの名無しさん:2005/06/23(木) 19:12:20
サンプルプログラムの中に
for(;;)
というのが出てきたのですが、これは何なのでしょうか?
50デフォルトの名無しさん:2005/06/23(木) 19:15:07
>>49
永久ループ
51デフォルトの名無しさん:2005/06/23(木) 19:17:09
>>50
なるほど、ありがとうございました。
52デフォルトの名無しさん:2005/06/23(木) 19:28:14
csvのデータを変数floatに格納したいのですがどのようにすればいいでしょうか?
3.23456,2.32,3.2213
2.322,2.2,3.3333
2.33,2.1,11.123
たとえばこの小数点を含むcsvのデータを
float型の二次配列に代入したいということです
float[0][0]には3.23546が
float[2][1]には2.2が入ります。
53デフォルトの名無しさん:2005/06/23(木) 19:30:22
>>52
scanf("%f,%f,%f"
54デフォルトの名無しさん:2005/06/23(木) 19:31:41
>>47
数字のデータなんですが、1行1万列ぐらいで、20行ぐらいあるんです。

>>48
一度、配列に全部入れてから一気に書き
出そうとも思ったんですが、データ数があまりにも多くて・・・
55デフォルトの名無しさん:2005/06/23(木) 19:35:59
>>54
どうしようもない
56デフォルトの名無しさん:2005/06/23(木) 19:36:18
>>54
あのな、「方法はあるのでしょうか? 」という質問だった筈だろ。
こんな場所でもちゃんとした回答が欲しいなら、ちゃんとした質問の仕方しろ。
57デフォルトの名無しさん:2005/06/23(木) 19:41:48
>>54
コンピュータにとっては、一万くらい大した量じゃないだろ。
58デフォルトの名無しさん:2005/06/23(木) 19:44:26
sizeof(float) * 10000 * 20 = 781 KB
59デフォルトの名無しさん:2005/06/23(木) 19:45:15
for(;;)はコンパイラの最適化で消されますか?
60デフォルトの名無しさん:2005/06/23(木) 19:47:51
>>59
質問の意味が分からんというか、何を期待してんの?
一意に消されるとは胃炎。つか普通消されるように書かねーよ。
returnの後とかな。
61デフォルトの名無しさん:2005/06/23(木) 19:49:02
質問。

int a[100];

この場合、 「a」でポインタを取得できますが、このときのポインタの型は

int (*)[100] ですか?

よく、

int *p = a;

とやりますが、これは、int(*)[100] が、 int*へ、暗黙の型変換されてい
ると理解すればよいのでしょうか?
62デフォルトの名無しさん:2005/06/23(木) 19:58:48
>>61
そうではない。
単純にint*になる。
int a[100][100]だと int (*)[100]になる。
単純に2次以上だと配列のサイズが型情報に入ると思えばよろしい。
63デフォルトの名無しさん:2005/06/23(木) 20:02:37
>>53
scanfはファイルからカンマ区切りで読み込む機能がついているのでしょうか?
よくわかりません。
64デフォルトの名無しさん:2005/06/23(木) 20:04:04
>>63
そーゆーのはmanとかgoogleとかで調べようね。
65デフォルトの名無しさん:2005/06/23(木) 20:25:36
>>54
テンポラリファイルを使うってのはどうよ?
66デフォルトの名無しさん:2005/06/23(木) 20:35:28
>>54

int newdata[]
に追加データが入っているものとする。

i = 0;

while ((c = getc(reader)) != EOF) {
  if (c != '\n') putc(c, writer);
  else {
    printf(",%d\n", newdata[i++];
  }
}

こんな感じでどうだ。無駄なメモリは一切食わん。
67デフォルトの名無しさん:2005/06/23(木) 20:35:57
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void) 
{
    char buf[1024];
    int len;
    float data;
    float num[2];
    int i;
    FILE *fp = fopen("test.csv", "r");
    if(fp == NULL){
        printf("読み取り失敗です\n");
        exit(2);
    }
    fgets(buf, 1024, fp);
    printf("buf=%s\n", buf);
    len = strlen(buf);
    data = atof(buf);
    printf("data=%.10f\n", data);
    fscanf(fp, "%f,%f,%f", &num[0], &num[1], &num[2]);
    for(i = 0; i < 3; i++)
        printf("num[i]=%f\n", num[i]);
    printf("test\n");
    fclose(fp);

    return 0;
}
68デフォルトの名無しさん:2005/06/23(木) 20:36:00
しつれい
fprintf(writer, ",%d\n", newdata[i++]);
だな。
69デフォルトの名無しさん:2005/06/23(木) 20:36:09
四苦八苦してなんとかファイルを一行ずつ読み出すことに成功しました。
しかし、これからどうやって変数に代入したらいいのかわかりません。
3.23456,2.32,3.2213
このデータからどうやってカンマ区切りの少数を3つ取り出せばいいのか…。
70デフォルトの名無しさん:2005/06/23(木) 20:36:35
>>68>>66ね。
71デフォルトの名無しさん:2005/06/23(木) 20:53:59
>>69
sscanf("3.23456, 2.32, 3.2213\n", " %f, %f, %f ", &boke[0], &boke[1], &boke[2]);
72デフォルトの名無しさん:2005/06/23(木) 21:19:52
#include<stdio.h>

int main(void)
{
    float boke[2];
     sscanf("3.23456, 2.32, 3.2213\n", " %f, %f, %f ", &boke[0], &boke[1], &boke[2]);

     return 0;
}
これを実行したらエラーR6002
floating-point support not loaded
が出て動きません。
今までこんなエラー出たこと無いのですが…。
73デフォルトの名無しさん:2005/06/23(木) 21:36:05
#include<stdio.h>

int main(void)
{
    float boke[2];
     sscanf("3.23456, 2.32, 3.2213\n", " %f, %f, %f ", &boke[0], &boke[1], &boke[2]);
     printf("boke[1]=%f boke[2]=%f boke[3]=%f", boke[0], boke[1], boke[2]);

     return 0;
}
printfを用いて値を表示させるようにしたらエラーは出なくなるけど強制終了…。
なんでだろう…?
74デフォルトの名無しさん:2005/06/23(木) 21:36:15
>72
見たことないエラーが出たんならぐぐれよ。
ttp://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/R6002.asp
あと、float boke[3]; な。
75デフォルトの名無しさん:2005/06/23(木) 21:40:52
76デフォルトの名無しさん:2005/06/23(木) 23:31:43
>>74
msdnが入っているのですが、読んでも専門用語だらけでなかなか理解できないのが現状です。
ヘルプを読解できるようになるためのサイトなどはないでしょうか?

>>75
ライブラリールーチンが無いのはわかったのですが
そもそもライブラリルーチンというものが何かわかりません…。
77デフォルトの名無しさん:2005/06/23(木) 23:36:55
>>76
マジレスするならば、
馬鹿は去れ。馬の耳に念仏。
78デフォルトの名無しさん:2005/06/23(木) 23:37:57
>>76
ライブラリルーチンとはようするにprintfとかscanfの定義(実体)だと思えばいい。

ところで専門用語は日本語にしてもカタカナにしただけになるから、
俺は専門用語だらけの英文は逆に普通の英文より読みやすい。
http://www.microsoft.com/japan/msdn/library/ja/vccore/html/R6002.asp?frame=true
79デフォルトの名無しさん:2005/06/23(木) 23:45:38
>>77
すみません。一日7時間程度やってるのに全然身につきません。
馬鹿なのはわかってます。
でも、やり始めたのだからある程度のレベルまでは行きたいんです。

>>78
定義ってヘッダファイルに記載されているやつじゃないんですか?
#include<stdio.h>で完了しているのでは。
80デフォルトの名無しさん:2005/06/23(木) 23:47:05
リンクの先は読まない、理解しようともしない、説明も聞かない
最悪だな
81デフォルトの名無しさん:2005/06/23(木) 23:55:44
とりあえずネットで検索するなり本を買うなりして
基礎からキチンと勉強する事をおすすめする
今までにでた単語を検索するだけで勉強になるぞ
82デフォルトの名無しさん:2005/06/23(木) 23:58:11
>>81
そうですね。とりあえず検索のスキルを高めてみたいと思います。
本は図書館に行っていろいろ読んでいるのですが
難しいのばっかりでなかなか身につきません。
83デフォルトの名無しさん:2005/06/23(木) 23:58:36
>>79
#include<stdio.h>の中に書いてあるのは関数の宣言。
84デフォルトの名無しさん:2005/06/24(金) 00:12:12

     .┌━┐    ┌━┐
      ┃┌╋──╋┐┃
      └╋┘    └╋┘
        ┃ ・   ・  ┃        ┌━━┐
    ●━╋┐    ┌╂━━━━╂┐  ┃
    └━┷┴━━╂┘        └╋━┘
同じスレにはコピペ ┌╋┐        ┌╋┐
できるけど、違う  ┃└╋╋━━╋╋┘┃
スレにはコピペでき ┃  ┃┃    ┃┃  ┃
ない不思議コピペ ┃  ┃┃    ┃┃  ┃
           └━┘┘   └└━┘
85デフォルトの名無しさん:2005/06/24(金) 00:12:43
>>79
おまえが作ったプログラムから呼び出される printf だとか scanf だとかその他もろもろの関数ってのは、
その中身(=実体)を誰かがコーディングしておいてくれてるわけ。
おまえが作ったプログラムをコンパイルして実行ファイルを作ると、お前の作ったプログラムに
そのだれかが作っておいてくれたプログラムコードがくっつけられるわけ。
そのくっつけられる printf だとか scanf だとかの実体のことが、ライブラリルーチン。
ちなみに、そのくっつける処理のことをリンク、くっつけるプログラムのことをリンカって言う。
printf だとか scanf だとかは、おそらくおまえが書こうとしても書けないくらい複雑なルーチンで、マジメに作ると
そのプログラムサイズもそこそこ大きいものとなる。
そこで、一部機能を省略して、プログラムサイズを抑えた printf や scanf がある。
ここで省略された機能が、小数に関する処理。
%f だとかの小数に関することが指定されると、エラーを起こして終了するように作られてる。
おまえの環境では、普通にコンパイルして実行ファイルを作ると、この省略版のライブラリが使われるんだろ。
だから、おまえが小数を使ったプログラムを作ったならば、省略版じゃないほうのライブラリをリンクしてもらうよう、
コンパイルのときにオプションをつけて指定しなくちゃいけない。
その方法は、おまえの環境のマニュアルなりなんなりを読むと書いてあるだろう。
86ビル・ジョブス:2005/06/24(金) 00:16:02
printf()作ろうとしても無理だから・・。と、言っているおれは自作の
リエントラントなprintf()を制御系用途に持ってたりもするがな。
87デフォルトの名無しさん:2005/06/24(金) 00:16:33
>>85
そんな難しい事言われても、さっぱりわかりません。
88デフォルトの名無しさん:2005/06/24(金) 00:24:56
>>87
やる気はあるようだね。
若ければ(小〜高1程度)なら可能性はあるが、大学生以上だとしたらダメぽ。

オプションで/FPi87というのを有効にする必要があるってこと。
プロジェクト設定のどっかに「浮動小数点を使う」とかないかね。
89デフォルトの名無しさん:2005/06/24(金) 00:28:22
90デフォルトの名無しさん:2005/06/24(金) 00:28:32
それにしてもなんでそんな設定になってんだろうな。
>>87は特殊な環境orターゲットでやってんのか?

x87が使えない>>87って、切ないな。
91デフォルトの名無しさん:2005/06/24(金) 00:29:26
>>74>>78はVCだと言っているようだが。
92デフォルトの名無しさん:2005/06/24(金) 00:30:23
93デフォルトの名無しさん:2005/06/24(金) 00:31:54
>>92
アホだ。finitされてないヨおじさん。
94デフォルトの名無しさん:2005/06/24(金) 00:36:14
>>85
詳しい説明ありがとうございます。
なるほど、思った以上に複雑な構成になっているのですね…。
リンカというのは聞いたことがあります。
MSDNのライブラリ見て調べてみます。

>>87
中々わかりませんよね。一緒にがんばりますか。

>>88
大学4年です。研究で必要になったのでやり始めました。
…もう遅いですね。

オプションってすごい量あるんですね。
全部見ていってみます。

>>90
家ではVisualC++ 6.0ですが
学校ではVisual Studio .NET 2003を使っています。
ちなみに、R6002のエラーはどちらでも出ます。
95デフォルトの名無しさん:2005/06/24(金) 01:14:55
ファイルの数値の読み取り方について質問があります。
そのファイル(data.txt)の中身としては

1 2 3 4
5 6 7
8 9 10 11 12
13 14

のように1行目は4列の整数データがあるのに
2行目は3列のデータ、3行目は5列のデータと、
行数によってまちまちの列数のデータがそれぞれスペースで区切られています。

このようなファイルから3列目のデータだけを
配列に格納していきたい場合はどのようにすればいいのでしょうか?

96デフォルトの名無しさん:2005/06/24(金) 01:20:09
>>95
while (fgets(buf, sizeof(buf), fp)) {
sscanf(buf, "%*d%*d%d", array[idx++]);
}
97デフォルトの名無しさん:2005/06/24(金) 01:38:14
char型で文字列を格納した配列がアルファベットかどうか1文字ずつ判断していく方法はありますか?
isalphaはint型じゃないと無理なんで…
98デフォルトの名無しさん:2005/06/24(金) 01:40:25
>>97
isalpha
99デフォルトの名無しさん:2005/06/24(金) 01:42:42
char c
if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')){
/* alpha */
}

それかintにコピして比較
10061:2005/06/24(金) 01:43:39
>>97
isalphaの引数がintなのはEOFが引数としてきた時のこをを考慮してだ。
別にcharのをキャストして渡しても問題ない。
明示的にキャストする必要もないが。
101デフォルトの名無しさん:2005/06/24(金) 01:48:17
#include<stdio.h>
float boke[2] = {0};

int main(void)
{
    boke[1] = 1.0;//浮動小数点を使ってやる。
    sscanf("3.23456, 2.32, 3.2213\n", " %f, %f, %f ", &boke[0], &boke[1], &boke[2]);

    return 0;
}
いろいろ検索してみると浮動小数点を明示的に使ってやら無いとだめみたいですね。
こうやるとエラーが出ませんでした。
しかし
#include<stdio.h>

int main(void)
{
    float boke[2] = {0};
    boke[1] = 1.0;
    sscanf("3.23456, 2.32, 3.2213\n", " %f, %f, %f ", &boke[0], &boke[1], &boke[2]);

    return 0;
}
こうなるとコンソールがクラッシュします。
どちらも明示的に使っているはずなのになぜ?
102デフォルトの名無しさん:2005/06/24(金) 01:48:46
他のライブラリとdefineがかぶった時はundefすれば回避できますが、
typedef した型名がかぶってしまった場合回避する方法はありますか?
103デフォルトの名無しさん:2005/06/24(金) 01:52:17
>>96
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/599.txt
↑で>>96さんのを参考に作ってみましたがエラーがでます;;
どこがおかしいのでしょう???

PS
data.txtの中身はスペースで区切ったはずですが、
tabに変換されてしまったようですので虫してください。

104デフォルトの名無しさん:2005/06/24(金) 01:54:07
エラーメッセージも言えねえのかよ
105デフォルトの名無しさん:2005/06/24(金) 01:55:53
>>102
該当インクルードファイルをインクルードしない。
或いは問題のキーワードをマクロで置き換えてtypedefさせない。
#define → #include → #undef
106デフォルトの名無しさん:2005/06/24(金) 01:55:57
107デフォルトの名無しさん:2005/06/24(金) 01:56:27
すいません。エラーメッセージ書き忘れてました。

"0x0040117e" の命令が "0x01168124" のメモリを参照しました。メモリが "read" になることはできませんでした。

プログラムを終了するには [OK] をクリックしてください
プログラムをデバッグするには [キャンセル] をクリックしてください

コンパイルはできるみたいなんですが実行すると上のメッセ-ジがでます。
108デフォルトの名無しさん:2005/06/24(金) 01:56:52
>>101
boke[2] は boke[0], boke[1] の二つしかないよ。
確保される場所が違うから片方で落ちたんだろうね。

>>102
無いかな。
とりあえず思いつかない。
#defineで誤魔化すようなことはできるけど。

>>104
sscanf(buf, "%*d%*d%d",  & array[idx++]);
じゃないかな。
109デフォルトの名無しさん:2005/06/24(金) 01:56:55
>>103
idxが初期化されてないよん。
110デフォルトの名無しさん:2005/06/24(金) 01:57:52
>>102
無い。
ダブらない名前をつけるしかない。
11197:2005/06/24(金) 01:58:17
う〜ん…isalpaでも大丈夫なんですか…
下みたいなプログラムを作ったんですけど、実行しようとすると強制終了してしまいます。
どこが悪いのか教えてください

#include<stdio.h>

int buf_check(int buf[],int str);

main(){

char buf[64];
int str;

printf("文字列を入力してください\n");
scanf("%s",buf);
str=strlen(buf);
if(buf_check(buf,str)==0){
printf("文字列の中にアルファベット以外の文字があります\n");
}
}

int buf_check(int buf[],int str){

int i;

for(i=0;i<=str;i++){
if(isalpha(buf[i])==0)
return 0;
break;
}
}
112デフォルトの名無しさん:2005/06/24(金) 01:58:56
>>105
なるほど。やってみます

ありがとうございました
113デフォルトの名無しさん:2005/06/24(金) 02:00:47
>>108-109
ありがとうございます!!
できました!
114デフォルトの名無しさん:2005/06/24(金) 02:01:43
>>111
int buf_check(char buf[], int str)

もう少し正しく書けば

int bun_check(const char buf[], int str)
11596:2005/06/24(金) 02:01:45
>>103
すまん、>108と>109参照で。
116デフォルトの名無しさん:2005/06/24(金) 02:01:56
>>108
なるほど、存在しないboke[2]に値を入れたから落ちたんですね。
float boke[3] = {0};
にすれば解決できました。
しかし、グローバル変数にしたら存在しないboke[2]に値入れてもエラー出ないんですね。
バグの原因になりそうです。
117デフォルトの名無しさん:2005/06/24(金) 02:04:30
>>115
%*d は勉強になりました。
ありがとうございました!
118デフォルトの名無しさん:2005/06/24(金) 02:04:45
>>116
エラーが出ないのはたまたま。
意図しないメモリ領域を書き換えていることには間違いなくて、どんな結果を起こすか想像もつかない。
119デフォルトの名無しさん:2005/06/24(金) 02:05:33
>>118
なるほど。気をつけないといけませんね。
120114:2005/06/24(金) 02:06:47
ありがとうございます!
でも。書き直して英字の文字列を入力しても文字列の中に
アルファベット以外の文字があるといわれてしまいます…

#include<stdio.h>

int buf_check(const char buf[],int str);

main(){

char buf[64];
int str;

printf("文字列を入力してください\n");
scanf("%s",buf);
str=strlen(buf);
if(buf_check(buf,str)==0){
printf("文字列の中にアルファベット以外の文字があります\n");
}
}

int buf_check(const char buf[],int str){

int i;

for(i=0;i<=str;i++){
if(isalpha(buf[i])==0)
return 0;
}
}
121デフォルトの名無しさん:2005/06/24(金) 02:09:15
>>120
それコンパイル通る?
全部がアルファベットだった場合、その関数は return 無しに終了しない?
122121:2005/06/24(金) 02:12:32
コンパイルは通るんだな。
へぇ
123デフォルトの名無しさん:2005/06/24(金) 02:14:43
>>120
forの条件が間違ってる
最後に非0をreturnしてない
124120:2005/06/24(金) 02:19:06
ありがとうございます!
そういえばfor文の条件はi<=strじゃなくてi<strですね
書き直したら正しく動きました
125デフォルトの名無しさん:2005/06/24(金) 02:21:55
>>124
問1
buf_check の第一引数に、const が付いている理由は?

先生にツッこまれる前に考えておいた方がいいよ
126125:2005/06/24(金) 02:31:49
う〜ん…内容が変わらない(変えられない?)からみたいな感じですか?
127デフォルトの名無しさん:2005/06/24(金) 02:53:33
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

int main(void)
{
    float boke[1000][8] = {0.0};
    char data[1024];
    int i = 0;
    FILE *fp;
    if ((fp = fopen("test.csv", "r")) == NULL){
        printf("Could not open file");
        exit(-2);
    }
    while ((fgets(data, 1024, fp)) != NULL){
    sscanf(data, " %f, %f, %f, %f, %f, %f, %f, %f "
                ,&boke[i][0], &boke[i][1], &boke[i][2], &boke[i][3],
                 &boke[i][4], &boke[i][5], &boke[i][6], &boke[i][7]);
    printf("boke[%d][0]=%f \nboke[%d][1]=%f \nboke[%d][2]=%f \nboke[%d][3]=%f \nboke[%d][4]=%f\n"
         "boke[%d][5]=%f \nboke[%d][6]=%f \nboke[%d][7]=%f\n",
          i, boke[i][0], i, boke[i][1], i, boke[i][2], i, boke[i][3],
         i, boke[i][4], i, boke[i][5], i, boke[i][6], i, boke[i][7]);
    i++;
    }
    fclose(fp);

    return 0;
}
やっとこさCSVファイルからデータを読み込むプログラムのベータ版ができました。
しかし、fgetsの戻り値がなぜかファイルの終わりになってもNULLになりません。
ループから抜けられないでスキャンし続けてエラーになります。
128デフォルトの名無しさん:2005/06/24(金) 03:00:59
あーいや、bokeをそのまま使って完成度高めてくとは・・・(笑
たぶん、最後に改行だけがあるんじゃないかな。
sscanfはスキャンに成功したフォーマットの個数を返すから、
それを拾って判定するべきかも。
129デフォルトの名無しさん:2005/06/24(金) 03:19:41
    while (1){
    fgets(data, 1024, fp);
    if ( flag == EOF)
        break;
    flag = sscanf(data, " %f, %f, %f, %f, %f, %f, %f, %f "
                ,&boke[i][0], &boke[i][1], &boke[i][2], &boke[i][3],
                 &boke[i][4], &boke[i][5], &boke[i][6], &boke[i][7]);
    printf("boke[%d][0]=%f \nboke[%d][1]=%f \nboke[%d][2]=%f \nboke[%d][3]=%f \nboke[%d][4]=%f\n"
          "boke[%d][5]=%f \nboke[%d][6]=%f \nboke[%d][7]=%f\n",
          i, boke[i][0], i, boke[i][1], i, boke[i][2], i, boke[i][3],
          i, boke[i][4], i, boke[i][5], i, boke[i][6], i, boke[i][7]);
    i++;
    }

    return 0;
}
sscanfならEOFがきちんと返ってきて正しく終了できました。ありがとうございました。
今後の課題は要素の数(この場合は8)が変わってもそれに応じて
変数の値を確保し、値を読むプログラムに完成度を高めて生きたいと思います。
bokeをそのまま使ったのはなんとなく語呂がよかったからです(苦笑
130デフォルトの名無しさん:2005/06/24(金) 03:21:09
>>127
出来てきたね。
上達したかったら、例えばcsvの1列が100個ある場合とか、考えてみるといい。
いまのやり方だと無理がある。
プログラミングは常に「楽しよう」と思わないとダメ。
131デフォルトの名無しさん:2005/06/24(金) 03:25:39
>>130
なるほど、プログラミングの負担が軽くなって楽になるように努力しろということですね。
なるべくコンパクトにまとまるように考えてみます。
132デフォルトの名無しさん:2005/06/24(金) 03:34:32
仕事で大量のデータ使うならデータベースを使うけどな。
133デフォルトの名無しさん:2005/06/24(金) 04:49:13
拡張子を指定して一時ファイル名を生成したいんですが
簡単な方法はありますか?
134デフォルトの名無しさん:2005/06/24(金) 05:54:16
一時ファイル名を生成してから、拡張子を追加する
135デフォルトの名無しさん:2005/06/24(金) 08:19:00
>>129
ちょっと待て。sscanf()の戻り値をチェックしたらその後fgets()する必要はないだろ。
136デフォルトの名無しさん:2005/06/24(金) 08:37:07
変数の修飾の仕方で質問です。
次のような感じでいいんでしょうか?

ポインタの指し示す先の値が volatile のとき
volatile char *p;

ポインタの値が volatile のとき
char * volatile p;

そして、
volatile char **p;
のときは、どこが volatile になるでしょうか?
137デフォルトの名無しさん:2005/06/24(金) 08:44:29
それでいい。
volatile char は char volatileと同じ。
修飾される。
138136:2005/06/24(金) 09:05:58
>>137
修飾されるか否かではなくて、どこが修飾されるかの問題なんです。
volatile char **p; … 1
char * volatile *p; … 2
char ** volatile p; … 3
みたいな書き方をしたとき、
3 は p そのものが、2 は *p が、1 は **p が volatile ってことでいいんですよね?
ようするに、volatile なメモリ領域を指し示すポインタの配列ならば 1 を、
volatile じゃないメモリ領域を指し示す配列の中身が volatile ならば 2 を、
volatile じゃないメモリ領域を指し示す volatile じゃない配列を指し示す volatile なポインタならば 3 を、
ということでいいんでしょうか?
139136:2005/06/24(金) 09:12:11
関連して質問ですが、main のプロトタイプを
void main(int argc, char **argv)
と書いたりしますが、より適切には
void main(int argc, const char * const *argv)
になったりしますか?
また、
void main(int argc, char argv[][])
の書き方を同様に修飾するなら、どんな書き方になるんでしょうか?
140デフォルトの名無しさん:2005/06/24(金) 09:30:17
文字列の連結関数についての質問です。
strcat() は自動的に領域を割り当てないということで、
以下のようなコードを書いて見ました。

これって、
1. C言語的に間違ってないでしょうか?
2. 普通はどうやるのが適切なんでしょう?

みんなが普通にやりそうなことなので、
サンプルを探したのですが、
あらかじめ領域を確保してるやりかたしか
みつけられませんでした。

ソースは後述 ↓
141140:2005/06/24(金) 09:31:04
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* stringCatEx(char *pBaseString, char *pAddString)
{
if (pBaseString == NULL) {
pBaseString = (char *)calloc(1, strlen(pAddString) + 1);
} else {
pBaseString = (char *)realloc(pBaseString, strlen(pBaseString) + strlen(pAddString) + 1);
}
pBaseString = strcat(pBaseString, pAddString);
return pBaseString;
}

void endStringCatEx(char *pString)
{
free(pString);
pString = NULL;
}
int main()
{
char *pString = NULL;
pString = stringCatEx(pString, "aaaaa ");
pString = stringCatEx(pString, "bbbb\n");
pString = stringCatEx(pString, "ccc ddd");
pString = stringCatEx(pString, "\neee");
printf("%s\n", pString);
endStringCatEx(pString);
return 0;
}
142137:2005/06/24(金) 09:39:06
>>136
複合宣言子パーサを書いてみるとよくと分かると思う。
簡略して言うと、宣言は識別子を基点に右を優先して解析していく。
宣言は左側にあるから、修飾は後にされるわけ。

> void main(int argc, const char * const *argv)
そうだね、適切かもしれないけど、慣用と違うってことで違和感あるかも。
ポインタ使う時にわざわざconstポインタにしないといけないしね(キャストしてもいいが)。

> void main(int argc, char argv[][])
*と[]は等価ではないよ。↑は宣言としてはエラーになる。
[]はあくまでサイズ未定義の配列(の先頭アドレス)だから。

>>140 - 141
どうだろう、微妙だなぁ。
mallocされたバッファが前提条件になるし、
stringCatExではそれをチェックする手立てがない。
C言語的には間違ってないと思うけど、endStringCatExのpString = NULL; は意味無い。
効率上問題なければこれでいいと思う。
ポインタだけチェインしてって、あとで一気に割り当てて連結したり、
普通にオーバーしないくらいのバッファを予め割り当てたり、
いろいろやり方あると思うけどね。
143137:2005/06/24(金) 09:41:14
> 宣言は左側にあるから、修飾は後にされるわけ。
この言い方は撤回。
「宣言が左側にあれば、修飾は後にされるわけ。」というべきだったか。
144デフォルトの名無しさん:2005/06/24(金) 09:45:24
>>141
第一引数の領域は malloc なり calloc なりでアロケートされるメモリ領域っていう前提でいいのかな?
それならそれでOKだと思うけど、後でその文字列領域をちゃんと free しないとだめだよ。
そして、もし間違って上記以外のポインタを渡してしまった場合、この関数がどう動作するか予測できなくなるよ。
145140:2005/06/24(金) 09:48:04
>>142 さん
お返事ありがとうございます。
C言語になかなか慣れないもんで、こんなレベルのソースです(はずかしや)

ポインタのチェーンで一気に割り当てってなんかよさげな気がしてきました。
ちょっとサンプルでも作ってみようかと思います。(わかるかなぁ)
146144:2005/06/24(金) 09:50:00
あっとごめん。ちゃんと free してるね。
ただ、endStringCatEx の中で pString = NULL; とやってるけど、呼び出しもとの pString が更新されるわけではないから
そこに注意。
呼び出しもとの pString を更新したいならば、
void endStringCatEx(char **pString)
{
if(pString != NULL) {
if(*pString != NULL) free(*pString);
*pString = NULL;
}
}
にして、呼び出し元もそれにあわせて変更、かな。
147デフォルトの名無しさん:2005/06/24(金) 09:54:14
>>142
argvはアプリケーションに向けて可変の領域が割り当てられていることになっているので
constではない。実際、書き換えても不都合はない。
148144:2005/06/24(金) 09:55:12
ちょっと質問。
if(pString != NULL && *pString != NULL) { ・・・ }
みたいな書き方って、意図した通りに動くことが保証される?
この if だと、pString != NULL が成立しなかった時点で *pString != NULL は評価されちゃいけないし、
何らかの都合で pString != NULL よりも先に *pString != NULL が評価されてもいけないよね。
この辺のことは最適化と関係しそうだけど、C言語としての規定ではどんな感じなんでしょう?
自分はこういうときには if を 2段にして書いてたけど。
149デフォルトの名無しさん:2005/06/24(金) 09:58:17
>>145
普通は、そこまで凝ったことして非効率にするより、個別に意識して書くことを選択するわけで……
そうそう、calloc()/realloc()の戻り値のチェックも忘れないようにね。
150デフォルトの名無しさん:2005/06/24(金) 09:59:28
>>147
呼び出した側がどんなメモリ領域を渡したかではなくて、その関数がそのメモリ領域をどう処理するのかで
プロトタイプが決まるんじゃないいの?
const * な関数に const じゃない領域を渡しても問題無いし、キャストもいらないよね?
いや、main の由緒正しいプロトタイプが何かって問題はさておいて。
151デフォルトの名無しさん:2005/06/24(金) 10:01:29
>>148
きちんと仕様くらい自分で調べられるようになろう。
&&と||については、只の演算子ではなく評価をショートカットできることが規定されているので大丈夫。
152140:2005/06/24(金) 10:06:07
>>149さん
「個別に意識して書くこと」といいますと・・・(^^;
すいません。どんなことなのかわからないです・・・。

すっごく効率悪そうなので、
なんかいい方法はないのかなぁとは思ってるんですが。
なにせC言語の世界がまったく見えてないもんで・・・。

1. 最初はどれぐらいの情報(最終的なstringの長さ)になるかわからない。
2. stringは次々と追加していきたい。

というのがやりたいことなんです。

えーと、たとえばHTMLをC言語で動的に組み上げるみたいな。
153137:2005/06/24(金) 10:11:43
>>140
言っといてアレなんだけど、
「ポインタのチェーンで一気に割り当て」ってのも問題が無いわけじゃない。
alloc系呼び出し回数は少ないけど、例えばmallocで割り当てた領域の文字列を
チェインされて、どっか別の所で開放されてしまったら、
チェインを連結する時にメモリアクセス違反になるだろうね。
140さんのやつも、生でchar*を使うから問題があるんで、
うまくカプセル化すればそこんとこは問題ないと思うよ。

>>147
「問題ある」とは言ってないぞ。漏れは好きくないが。


#argvについて、もう一つ言えば、argv[argc」== NULLも保証されてる。
#ターミネートされてるんなら、argcは何のために・・・?
154148:2005/06/24(金) 10:12:25
>>151
ありがとう。
調べたいのはやまやまなのですが、その記述にどのような手順でたどり着くのか、キッカケが無いと見当を
つけるのもなかなか難しくて・・・
あつかましいながら改めて確認なのですが、式が && の左側から評価されることも保証されてるってことでOKですか?
つまりは、演算子の優先順位と結合規則順に式が評価されることは保証されるのか?と言うことなのですが。
155154:2005/06/24(金) 10:16:33
&& と || は特別的な扱いというならば、おそらくその評価順は保証されてるんでしょうね。
むしろ == なんかの方が気になってきました。
個別の回答よりも、もしよろしければ仕様へのポインタを示していただけると大助かりです。
156デフォルトの名無しさん:2005/06/24(金) 10:24:25
シンプソン法で積分を求めるプログラムを書いてみようと思い,
マクロの復習をかねようということで,マクロ関数を用いて
以下のソースを書いてみたのですが

57行目で構造体の要素がどれも定義されていないと怒られます.
いろいろと調べ,考えたのですが解決できませんでした.
どなたか何が原因か教えてください!!

ソース
157デフォルトの名無しさん:2005/06/24(金) 10:25:55
阻止
158136=138:2005/06/24(金) 10:26:15
>>143
うーん・・・
その言い回しを理解するのにはちょっと時間がかかりそうです。
宣言が左にあれば、修飾は後ということは、
char * volatile *p;
は、volatile はその左の char * を修飾しているということになりますか?
そうだとすれば、char * 自体が volatile で、p はそのポインタを指し示すポインタ、ということになるわけですか。
じゃあ
volatile char **p;

char ** volatile p;
の読み方はどんな感じになるんでしょうか?
159デフォルトの名無しさん:2005/06/24(金) 10:26:22
#include <stdio.h>

#define hantei 0.0001
#define ABS(num) ((num)>=0 ? (num) : -(num))
#define Odd_Even( c ) {\
c->odd = 0;\
c->even = 0;\
c->y0 = (*f)(a);\
c->y2n = (*f)(a + n * h);\
for(i = 1;i < n;i+=2) {\
c->odd+=(*f)(a + i * h);\
}\
for(i = 2;i < n - 1; i+=2) {\
c->even+=(*f)(a + i * h);\
}\
}

#define total(c) (( c>-y0 + c>-y2n + 4.0 * (c>-odd)+ 2.0 *( c>-even)) * h / 3.0)

double myfunction( double );
double simpson(double, double, double (*) (double));


160159続き:2005/06/24(金) 10:27:10
typedef struct Menseki{
double y0;
double y2n;
double odd;
double even;
}menseki;

main() {

double a, b;
scanf("%lf", &a);
scanf("%lf", &b);
simpson( a, b, *myfunction);
}

double myfunction(double x) {
return(1.0/x);
}

161156:2005/06/24(金) 10:28:33
うぎゃー 阻止されてしまいましたw

159と160がソースですので
よろしくお願いします
162デフォルトの名無しさん:2005/06/24(金) 10:30:53
>>153
malloc なんかは呼出回数が少ないに越したことは無いんだけど、realloc は多少何度も呼び出しても
差し支えないんじゃないかな。
できるだけコストがかからないよう、メモリ領域が移動しないように再割り当てしてくれてるんだから、
ユーザー側で実装を複雑にするよりも、そういう機能を積極的に活用した方がメリットが多そう。
163デフォルトの名無しさん:2005/06/24(金) 10:32:24
>>161
問題の57行目ってどこよ。
164156:2005/06/24(金) 11:05:48
>>163
わかりづらくて申し訳ありません.

S2 = total(men);

としてマクロ関数を呼び出しているところです.
なお,ここをコメントアウトすると今度はこの下で
同じマクロ関数を呼び出すところで同じエラーがでるので
この関数に問題があるのではとおもっています...

よろしくお願いします
165デフォルトの名無しさん:2005/06/24(金) 11:21:15
>>164
1. mem ではなくて &men を渡すべきじゃないか
2. マクロの定義において、c を (c) に置き換えるべきじゃないか
166315:2005/06/24(金) 11:37:56
続き
double simpson(double a, double b , double(*f) (double))
{

int n=2;
int i;
double h;
double S1 = 0, S2 = 0;

menseki *men;
men = (menseki *) malloc(sizeof(menseki));

h=(b-a)/(double)2;

Odd_Even(men);
S2 = total(men);

while( ABS(S2 - S1) >= hantei) {
n*=2;
h/=2;
Odd_Even(men);
S1 = S2;
S2 = total(men);
}
printf("Intergral : %lf\n",S2);
free(men);
}
167315:2005/06/24(金) 11:39:17
>> 165

ごめんなさい
肝心の部分のソースを忘れてましたorg

マクロの部分を書き換えて試してみます!
168ktc:2005/06/24(金) 11:41:57
問2. 入力された文字列を連続して表示するプログラムを関数を使って作成せよ。
問3. 入力された文字列の文字を逆から表示するプログラムを関数を使って作成せよ。

やってください。お願いします。
169デフォルトの名無しさん:2005/06/24(金) 11:54:48
>>168
>>1
> ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
死んでください。
170ktc:2005/06/24(金) 12:04:09
できないから死んでとかいうん?
171143:2005/06/24(金) 12:14:49
>>158
ここで複合宣言子の規則について詳細に書くつもりはないが、
char * volatile *p;
は、左の char * を修飾している。そりゃそうだ。
volatile char **p はcharを修飾している。
char ** volatile p はchar**を修飾している。
パース過程はこんな感じかな。
pは・・・
pはvolatile修飾された・・・
pはvolatile修飾された・・・へのポインタである
pはvolatile修飾された・・・へのポインタへのポインタである
pはvolatile修飾されたcharへのポインタへのポインタである
172315:2005/06/24(金) 12:16:42
>>165

やはりcを全て(c)に置き換えても同じエラーがでます...
あー何時間考えてもわからなーい!!
173デフォルトの名無しさん:2005/06/24(金) 12:20:42
パット見、これが一番怪しいわけだが…
×>-
○->
でわ?
174デフォルトの名無しさん:2005/06/24(金) 12:21:53
>>165があまりにもボケ過ぎる件について
175デフォルトの名無しさん:2005/06/24(金) 12:36:41
> できないから死んでとかいうん?
m9(^Д^)プギャー
176315:2005/06/24(金) 12:48:08
>>173

おおおーー 正にそのとおりでした!
やっと頭痛の種が消えました
本当にありがとうございます
177デフォルトの名無しさん:2005/06/24(金) 12:53:41
>>162
realloc()はメモリ領域が移動しないことを保証しないのだが。

>>156
長いもんはアップローダ使おうな。

>>158
volatile const char * p;
なんてこともあるね。

>>155
JIS x3010とか。
少しは検索しようや。
ttp://www.jisc.go.jp/
178デフォルトの名無しさん:2005/06/24(金) 13:17:42
if(memcmp(buf1,buf2)==0)
{
}

上記の判定があるのですが、buf1に文字列ABCD buf2に文字列ABCがあったと
します。今まではbuf1にbuf2が含まれていても、完全一致でも
どっちでもよかったのですが、今回から完全一致にしないといけなくなりました
どうしたら良いですか?
179デフォルトの名無しさん:2005/06/24(金) 13:19:24
>>178
memcmpにはもう一個引数があった筈だが。
180デフォルトの名無しさん:2005/06/24(金) 13:20:27
なんで strcmp 使わないんだ、っつー話ですな。
181デフォルトの名無しさん:2005/06/24(金) 13:21:34
すみません。長さの引数わすれました。sizeof(buf2)がぬけました
182デフォルトの名無しさん:2005/06/24(金) 13:24:47
>>181
だから何故strcmp()を使わないのかと。
183デフォルトの名無しさん:2005/06/24(金) 13:27:13
strcmp使います。ありがとうございました。
184デフォルトの名無しさん:2005/06/24(金) 13:27:49
なんかワラタ
185デフォルトの名無しさん:2005/06/24(金) 13:30:34
おもしろいw
186デフォルトの名無しさん:2005/06/24(金) 13:31:19
>>177
できるだけコストがかからないよう、メモリ領域が移動しないように
~~~~~~~~~~~
187186:2005/06/24(金) 13:37:04
あれ、あらためて man を引いてみたら、“できるだけ”ですら移動しないなんて書いてないな。
スマソ
この実装について前になんかのドキュメントで読んだ気がするんだけど、気のせいだったかな。
188デフォルトの名無しさん:2005/06/24(金) 13:47:23
>>187
仕様で「できるだけ〜」とか書いても意味無いから。
もちろん、大抵の実装においてはあまり移動しないようにしてるだろうけど。
189デフォルトの名無しさん:2005/06/24(金) 13:49:16
>>186
規格やmanがどうあれ、実際がどうなのか試してみたほうが実際的じゃね?
int main(void)
{
char *p;
printf("%p\n", p = malloc(sizeof(p)));
printf("%p\n", p = realloc(p, sizeof(p) + 10));
printf("%p\n", p = realloc(p, sizeof(p) + 20));
printf("%p\n", p = realloc(p, sizeof(p) + 30));
printf("%p\n", p = realloc(p, sizeof(p) + 40));
return 0;
}

案の定、途中で別のmallocとかはさむとアドレス変わるようだね。
まぁしかし、漏れのWinでは出来るだけ移動しないよう、必死にしがみついてるようにみえる。
190初心者:2005/06/24(金) 13:59:19
C言語をやる時ってお金かけなくてもできますか?
191デフォルトの名無しさん:2005/06/24(金) 14:05:03
できます。
192デフォルトの名無しさん:2005/06/24(金) 14:06:23
>189
同じく linux でこれやってみた。
void main()
{
void *p1 = NULL, *p2 = NULL;
int i;
for(i=0; i<100; i++) {
printf("%p %p\n", p1=realloc(p1, i*100), p2=realloc(p2,i*100));
}
free(p1);
free(p2);
}
できるだけ移動しないようがんばってる。
でもこのことに強く縛られるコーディングは、環境依存になっちゃうかな。
やっぱ規格に無いことを仮定するわけにはいかないかな。
とは言え、普段は realloc はできるだけメモリ領域を移動させないようがんばってくれてる、として扱っちゃってるけど。

>>190
本くらいは買った方がいいかも。
コンパイラなどはタダで手に入る。
193デフォルトの名無しさん:2005/06/24(金) 14:38:18
こんなとき dataTable の 配列の数を取得する関数なんてないでしょうか?
この場合は KOUZOUTAI の配列3つなので、「3」 を返すようなものです。

struct KOUZOUTAI{
char *hoge;
char *hage;
};

struct KOUZOUTAI dataTable[] = {
{"aaa", "aa"},
{"bb", "bbb"},
{"c", "cccc"},
};
194デフォルトの名無しさん:2005/06/24(金) 14:46:08
つsizeof(dataTable)/sizeof(dataTable[0])
195デフォルトの名無しさん:2005/06/24(金) 14:48:50
試してないけど、これでどうだろう
sizeof(dataTable)/sizeof(*dataTable)
196デフォルトの名無しさん:2005/06/24(金) 16:41:27
すみません。おしえてください。
結果をリダイレクトする為にCソースコード内で
テキストに追加モードで結果出力するコードを書きたいです。
ストリーム?とかいう言葉を耳にした事はあります。
できればUNIXでもWindowsでコンパイルしても有効な方法がいいと思ってます
よろしくお願いします。
197デフォルトの名無しさん:2005/06/24(金) 16:41:39
.┌━┐    ┌━┐
┃┌╋──╋┐┃
└╋┘    └╋┘
┃ ・   ・  ┃        ┌━━┐
●━╋┐    ┌╂━━━━╂┐  ┃
└━┷┴━━╂┘        └╋━┘
同じスレにはコピペ ┌╋┐        ┌╋┐
できるけど、違う  ┃└╋╋━━╋╋┘┃
スレにはコピペでき ┃  ┃┃    ┃┃  ┃
ない不思議コピペ ┃  ┃┃    ┃┃  ┃
└━┘┘   └└━┘
198デフォルトの名無しさん:2005/06/24(金) 16:42:40
sin(x) = x - x3/3! + x5/5! - ...を計算ができません。
教えてください!

199デフォルトの名無しさん:2005/06/24(金) 16:43:10
>>196
何が聞きたいんだ?
200デフォルトの名無しさん:2005/06/24(金) 16:44:00
>>198
テイラー展開
201デフォルトの名無しさん:2005/06/24(金) 16:46:48
>>200
テイラー展開ってどうすればいいでしょうか?
まだ、はじめたばかりなんで全然わかんないんです。
202デフォルトの名無しさん:2005/06/24(金) 17:08:56
>>201
http://www.nyanya.sakura.ne.jp/es/math/tenkai.html
sin ならマクローリン展開の方を見たほうがいい。
f(x) の f に sin を当てはめて式を解けば、sin を単純な式で表すことができるよ。

203デフォルトの名無しさん:2005/06/24(金) 17:31:48
スペースで区切ったいくつかの文字列を一気に入力して、それぞれの文字列を
二次元配列に格納するにはどうすればいいんでしょうか?全然わかりません・・
204デフォルトの名無しさん:2005/06/24(金) 17:40:43
     .┌━┐    ┌━┐
      ┃┌╋──╋┐┃
      └╋┘    └╋┘
        ┃ ・   ・  ┃        ┌━━┐
    ●━╋┐    ┌╂━━━━╂┐  ┃
    └━┷┴━━╂┘        └╋━┘
同じスレにはコピペ ┌╋┐        ┌╋┐
できるけど、違う  ┃└╋╋━━╋╋┘┃
スレにはコピペでき ┃  ┃┃    ┃┃  ┃
ない不思議コピペ ┃  ┃┃    ┃┃  ┃
           └━┘┘   └└━┘
205デフォルトの名無しさん:2005/06/24(金) 17:46:45
>>201
Cの話とは違う話だけど、
sin を微分すると cos、cos を微分すると -sin になる。
f' ってのは f を一回微分すること、f'' ってのは f を二回微分すること。
さらに sin(0) = 0、cos(0) = 1 を踏まえれば、式を解くことができるでしょ。
出来上がった式をループで表現するなりなんなりでがんばってみ。

206デフォルトの名無しさん:2005/06/24(金) 17:55:51
207デフォルトの名無しさん:2005/06/24(金) 18:00:06
というかなんで>>198が解きたくてテイラー展開(またはマクローリン展開)さえしらないんだ?
普通逆だろ。
208デフォルトの名無しさん:2005/06/24(金) 18:05:24
>>207
学校の課題だからじゃねーの?
209デフォルトの名無しさん:2005/06/24(金) 21:37:24
宿題ばっかりだな
210デフォルトの名無しさん:2005/06/24(金) 21:59:46
大学ならマクローリン展開は一年前期で習うわけだが
高専とかかな?
211デフォルトの名無しさん:2005/06/24(金) 22:22:42
マクローリン展開をマクロ展開だけで計算しよう。
なんちゃって。
212デフォルトの名無しさん:2005/06/24(金) 22:37:30
「ーリン」はどこへ?
213デフォルトの名無しさん:2005/06/24(金) 22:43:35
画面にchをno回連続して表示する関数
 void put_nchar(char ch,int no){・・・}
を作成し、この関数を利用して平行四辺形を表示するプログラムを作成せよ。

実行結果
   
平行四辺形を作ります。
横幅:5
高さ:3
* * * * *
* * * * *
* * * * *

上の実行結果の例では、1行に*を5個表示する関数put_nchar()を3回呼び出す。
呼び出す時には実引数chには'*'を指定する。

ずれてるかもしれないけど、この問題教えてください
214デフォルトの名無しさん:2005/06/24(金) 22:46:27
>>213
C/C++の宿題を片付けます 46代目
http://pc8.2ch.net/test/read.cgi/tech/1119514274/l50
215デフォルトの名無しさん:2005/06/25(土) 00:09:56
ところで、皆さんは、自宅でプログラミング打ってますか?自分、
プログラミングを家でやりたいと思っているんですが、どんなコンパイラが
いいか知りたいんですけど、ちなみに、c言語です
216デフォルトの名無しさん:2005/06/25(土) 00:14:08
217デフォルトの名無しさん:2005/06/25(土) 00:38:14
216
見れないよ。
218デフォルトの名無しさん:2005/06/25(土) 00:41:19
>>217
みれるよ。
219デフォルトの名無しさん:2005/06/25(土) 00:47:47
>>218
見られるよ。
220デフォルトの名無しさん:2005/06/25(土) 00:51:48 BE:337147968-
最近よくimeのサーバが止まるキガス…

>>217
URLをドラッグ&コピーしてブラウザに貼り付けるとイイよ。
([ショートカットのコピー]ではなく[コピー]で。)
221デフォルトの名無しさん:2005/06/25(土) 00:52:25
>>219
見られられないよ
222デフォルトの名無しさん:2005/06/25(土) 01:08:41
http://www7.plala.or.jp/hop-step-jump/
のC/C++のお勉強〜WisdomSoftのススメ〜
223デフォルトの名無しさん:2005/06/25(土) 01:20:18
>>150
余談だが、VCではconstを付けると落ちる。
224デフォルトの名無しさん:2005/06/25(土) 01:24:52
>>223
え?
int main(int argc, char const * const argv)
とかいて、
**argvのなかをかきかえるとおちるということ?

なんで?
225デフォルトの名無しさん:2005/06/25(土) 01:29:32
落ちないよ。
226デフォルトの名無しさん:2005/06/25(土) 01:30:03
>>223
なんで落ちるんだろう?
手元の VC++ 6.0 で

#include <stdio.h>

int main(int argc, const char * const *argv)
{
 printf("hello world! %d, %p\n", argc, argv);
 getchar();
 return 0;
}

を実行してみたけど、普通に動いたよ。
トレースして落ちる原因を探ってみたいね。
227デフォルトの名無しさん:2005/06/25(土) 01:39:45
とゆうか、main()をどう宣言しようが
それを呼ぶ側のコード(argvを確保してるコード)は変わらない

んだから、ふつうに考えりゃおちるわきゃない
228デフォルトの名無しさん:2005/06/25(土) 01:48:13
>>227
もしかしたらさ、もし C++ のコンパイラだったりすると、プロトタイプの違いで意図しない関数エントリにリンクしちゃったりして?
229デフォルトの名無しさん:2005/06/25(土) 01:55:05
>223がトレースしてくれれば話は早い。
230デフォルトの名無しさん:2005/06/25(土) 01:55:42
>>228
ああ、なるほど、type safe linkingならそうなりそうだが
C++であってもmain()の宣言が適当でも動くよな



なんでだろう
231デフォルトの名無しさん:2005/06/25(土) 02:42:41
C言語で、fgetsに複数行入力できるような機能を追加したような
関数を作りたいのですが、どうすればいいですか。
232デフォルトの名無しさん:2005/06/25(土) 02:57:01
fgetc()をループ
233デフォルトの名無しさん:2005/06/25(土) 02:58:49
fgetsをループでいいんじゃ。。。
234デフォルトの名無しさん:2005/06/25(土) 03:03:12
>>232-233
前に入力した行までback spaceで戻って修正する機能が
欲しいのです。
235デフォルトの名無しさん:2005/06/25(土) 03:08:42
>>234
それは入力されるプログラム側ではなく、入力する端末エミュレータ側の問題。
236デフォルトの名無しさん:2005/06/25(土) 03:10:45
なんだ、こういうことじゃないか
#include <stdio.h>
void *fgets_n(void *buf, size_t bufsize, int getlines, FILE *fp)
{
  int i = 0;
  char *p = buf;
  if( p == NULL || bufsize <= 0)
  {
    return NULL;
  }
  if( bufsize > 2 && getlines > 0 && fp != NULL )
  {
    int ch, line_cnt = 0;
    while( i < bufsize-1 && EOF != (ch = fgetc(fp)))
    {
      p[i++] = ch;
      if( p[i-1] == '\n')
      {
        if( ++line_cnt == getlines )
          break;
      }
    }
  }
  p[i] = '\0';
  return buf;
}
237デフォルトの名無しさん:2005/06/25(土) 03:18:50
>>236
どうもです。
これってどのようにして使うのですか。
238デフォルトの名無しさん:2005/06/25(土) 03:22:03
fgets とおなじ。
一度に取得したい行数を引数getlineで指定。
あんまり、使い道はないかと思うけどw

fgets にあわせるなら、こうだな。
#include <stdio.h>
void *fgets_n(void *buf, size_t bufsize, int getlines, FILE *fp)
{
  int i = 0;
  char *p = buf;
  if( p == NULL || bufsize <= 0 || fp == NULL || feof(fp))
  {
    return NULL;
  }
  if( bufsize > 2 && getlines > 0)
  {
    int ch, line_cnt = 0;
    while( i < bufsize-1 && EOF != (ch = fgetc(fp)))
    {
      p[i++] = ch;
      if( p[i-1] == '\n')
      {
        if( ++line_cnt == getlines )
          break;
      }
    }
  }
  p[i] = '\0';
  return buf;
}
239デフォルトの名無しさん:2005/06/25(土) 03:25:38
>>238
どうもです。
やっぱりbackspaceで戻れないのは仕方ないみたいですね。
複数行の入力の参考にしてみますです。
240デフォルトの名無しさん:2005/06/25(土) 04:12:51
そろそろビットシフトしていいですか?
241デフォルトの名無しさん:2005/06/25(土) 05:32:42
遅レスじゃが

>>133
ANSI標準ではないが、mktemp()という関数があるから
ソース探して参考にしなはれ
242デフォルトの名無しさん:2005/06/25(土) 06:26:37
なんだこの低レベルな遣り取り。
>236=238は>234も読めないらしいし、>234=>237は>235も読めないらしい。
そもそも1行内は編集可能なのはfgets()とは無関係だと判っていないのだろうか。
243デフォルトの名無しさん:2005/06/25(土) 08:21:13
自分から低レベルとか言っといて
話に入ってくるなよw
244デフォルトの名無しさん:2005/06/25(土) 09:31:50
>>243
低レベルだから入れるんじゃないか。
高レベルなら入る必要ないしね。
245デフォルトの名無しさん:2005/06/25(土) 10:19:57
C言語は比較的低レベルな言語ですが?
246デフォルトの名無しさん:2005/06/25(土) 10:36:01
まぁ文句は誰でもできるからな。
難しいのは誰もが納得する代案を提示することだ。
247デフォルトの名無しさん:2005/06/25(土) 12:51:11
そこで織田信長ですよ
248デフォルトの名無しさん:2005/06/25(土) 13:01:26
int 人間 = 50;

if ( 人間 <下天のもの ) return like(夢, 幻);

return NULL;
249デフォルトの名無しさん:2005/06/25(土) 15:05:09
>>247
正直、織田信長を最初に知った時、
このネーミングセンスに驚いたよ。(w
250デフォルトの名無しさん:2005/06/25(土) 15:23:06
>>223
そもそもargvは書き換え可能でなければならないわけだが。
251デフォルトの名無しさん:2005/06/25(土) 16:22:12
>>250
それは main を呼び出す側に課せられた条件でしょ?
main の中以降で argv を書き換えないならば、const 指定しても問題ないはずじゃないの?
252デフォルトの名無しさん:2005/06/25(土) 16:51:38
>>251
typing時間の無駄
253デフォルトの名無しさん:2005/06/25(土) 16:53:22
>>252
タイプ数を減らすことはオプティマイザが最適化するヒントを減らす以上に価値のあることなのか?
254デフォルトの名無しさん:2005/06/25(土) 17:21:06
ヒント:エントリポイント
255デフォルトの名無しさん:2005/06/25(土) 17:37:54
なぜか関数の一番初めにprintfを書いても
それすら実行されずにsegmentation faultになります
どなたかおたすけおぉぉ

void klt_data()
{

D('z');
FILE *fp;
char buffer[MAX_BUFFERSIZE];
char file_name[MAX_FILENAME];
double eigen_vector[MAX_IMAGESIZE][MAX_IMAGESIZE];
double eigenT_vector[MAX_IMAGESIZE][MAX_IMAGESIZE];
int dim_num,n;
int x,y,i,j;


D('z');
/* 固有ベクトルファイルのオープン */
printf("固有値ベクトルファイルの名前:");
scanf("%s",file_name);
fp = fopen(file_name,"rb");
if(NULL == fp){
printf("その名前のファイルは存在しません。\n");
exit(1);
}
以下続
256デフォルトの名無しさん:2005/06/25(土) 17:38:47
あ Dはprintfですー

257デフォルトの名無しさん:2005/06/25(土) 17:41:51
>>255
printf()の最初の引き数はなんでしょう。
258デフォルトの名無しさん:2005/06/25(土) 17:47:11
>>257
えっと intです!
259デフォルトの名無しさん:2005/06/25(土) 17:47:46
あほかい。
260デフォルトの名無しさん:2005/06/25(土) 17:48:22
>>254
エントリポイントがどうした
261デフォルトの名無しさん:2005/06/25(土) 17:48:28
#define D(a) fprintf(stdout,"-------------------debug %d--------------------\n",a)

と定義してます.
途中でintとかもだせるように intにしいときました
262デフォルトの名無しさん:2005/06/25(土) 17:53:35
>あ Dはprintfですー

>#define D(a) fprintf(stdout,"-------------------debug %d--------------------\n",a)
>と定義してます.
>途中でintとかもだせるように intにしいときました

書いていることが矛盾だらけ。
263デフォルトの名無しさん:2005/06/25(土) 17:55:18
>>261
あー、わかった。
標準出力はバッファリングされている可能性あり。
264デフォルトの名無しさん:2005/06/25(土) 17:56:12
>>262

ごめんなさい まだCのことがよくわかってなくて・・・

printfじゃありませんでした fprintfです.
それとintもだせるように%dにしましたの間違いです

どうして一番初めすら実行されずにsegmentation faultになるのか
どうしてもわかりません

よろしくお願いします
265デフォルトの名無しさん:2005/06/25(土) 17:57:10
>>255
その関数はなくて、他の部分に問題があるんじゃないのかな?
あと、MAX_IMAGESIZE と MAX_IMAGESIZE の定義はいくつくらいになってるの?
あんまりデカいと stack overflow するかも。
つーか、stack overflow のせいで segmentation fault が出てるのかも?
266デフォルトの名無しさん:2005/06/25(土) 18:00:18
とうとうmallocを使う時がきたようだ。
267デフォルトの名無しさん:2005/06/25(土) 18:01:32
>>263
すいません 知識不足で申し訳ないのですが どういう意味でしょうか?

>>265
その二つはともに1024です.
ひとつ思いあたるのは,この関数を呼び出す前にサイズが40000
の配列を用いているのでそれが原因でしょうか?

でも,この関数単体で実行させてもsegmentation faulltになります・・・
268デフォルトの名無しさん:2005/06/25(土) 18:02:43
malloc・・・それは最後のフロンティア・・・
269デフォルトの名無しさん:2005/06/25(土) 18:04:16
>>267
1024 * 1024 * sizeof(double) = 8MB
そういう配列が 2個もあるから、スタックに 16MB 以上のデータがあることになるよね。
スタックって有限だから、そのデータがスタックに収まりきらないんだよ。
malloc で確保した方がいいよ。
270デフォルトの名無しさん:2005/06/25(土) 18:10:43
>>269

やっと理解しました ありがとうございます!
mallocはなんか難しいそうで敬遠していましたが
チャレンジしてみようと思います

最後のフロンティア・・・

恐ろしい
271デフォルトの名無しさん:2005/06/25(土) 18:22:19
>>270
使うデータを構造体にして、それを一括で malloc すると便利じゃないかな。

typedef struct {
 double eigen_vector[MAX_IMAGESIZE][MAX_IMAGESIZE];
 double eigenT_vector[MAX_IMAGESIZE][MAX_IMAGESIZE];
} MYDATA;

みたいにして、

void klt_data()
{
 FILE *fp;
 char buffer[MAX_BUFFERSIZE];
 char file_name[MAX_FILENAME];
 MYDATA *data;

 data = malloc(sizeof(*data));

}

こんなかんじ。
MYDATA のメンバに、関連する変数も一緒に入れておくといいと思う。
あと、malloc したメモリがいらなくなったら free を忘れずに。
272デフォルトの名無しさん:2005/06/25(土) 18:25:53
>>270
>>263
標準出力はバッファリングされるので、printf()で毎回出力されるとは限らない。
エラーチェックの目的で使うなら、バッファフラッシュを行なうかバッファリングされないエラー出力を使うべき。
273デフォルトの名無しさん:2005/06/25(土) 18:27:45
>>272
たいていは標準出力は改行でフラッシュされるようになってるはず
(標準エラー出力はとっととフラッシュされる)
274デフォルトの名無しさん:2005/06/25(土) 18:49:51
>>271
どうも親切にありがとうございます.
そのとおりにやってみたところなぜかエラーが!
自分で考えてみようと思います

>>272 273
念のためstderrに出力するようにします!
275デフォルトの名無しさん:2005/06/25(土) 18:52:01
>>274
必要なヘッダファイルが include されてないとか?
まあがんばれ。
276デフォルトの名無しさん:2005/06/25(土) 18:55:03
int の二重配列へのポインタの定義方法について質問です。

typedef int ARRAY[4][4];
ARRAY *p;

これはうまくいきます。
これを typedef を使わないで書きたいと思い、

int[4][4] *p;

としたら、コンパイルでエラーとなりました。
どのように書くべきでしょうか?
277デフォルトの名無しさん:2005/06/25(土) 19:00:42
#if (sizeof(wchar_t)==2)
hoge()
#endif
みたいなことってできますか?
wchar_t==2とint==4をやりたいのですが。。
278デフォルトの名無しさん:2005/06/25(土) 19:01:17
すいませんhoge();ですね↓
279デフォルトの名無しさん:2005/06/25(土) 19:02:33
>>276
int (*p)[4];
280デフォルトの名無しさん:2005/06/25(土) 19:04:49
>>277
automake/autoconf でも使えば?
281デフォルトの名無しさん:2005/06/25(土) 19:05:23
>>279
ありがと!
int (*p)[4][4]; でイケました!
282デフォルトの名無しさん:2005/06/25(土) 19:07:20
>>281
それ3次元配列へのポインタだぞ
2次元配列なら>>279であってる
283274:2005/06/25(土) 19:12:35
>>275 
>>271

何度も申し訳ないのですがやはりできません
いろいろと調べてためしに以下のようにして
コンパイルしたのですが

confllicting type for data等のエラーメッセージが出てしまいます...

typedef struct mydata{
unsigned int matrix[MAX_DATA_NUM][3];
unsigned char image1[MAX_IMAGESIZE][MAX_IMAGESIZE];
unsigned char image2[MAX_IMAGESIZE][MAX_IMAGESIZE];
}MYDATA;

MYDATA *data;

data = (MYDATA * )malloc(sizeof(MYDATA));
284277:2005/06/25(土) 19:13:26
280さん、ありがとうございます、調べてやってみます。
285デフォルトの名無しさん:2005/06/25(土) 19:19:38
>>282
4x4 の int の配列を指し示すポインタが欲しいのですが、>>279 で合ってますか?
>>279 だと添え字が一次元分しか指定できませんが、もう一つの添え字のサイズはいくつになるのでしょう?
また、>>281 において

printf("%p\n", &(*p)[y][x]);

にて各要素のポインタを確認しましたが、正しい位置を示しています。
しかし >>279 の方法では

 printf("%p\n", &p[y][x]);

で同様のポインタを示しますね。
どう理解したらいいでしょうか?
286デフォルトの名無しさん:2005/06/25(土) 19:24:26
>>285
君は一次元配列を指すときにどうやっとるのか
int a[N];
int *p = a;
だろ。ここには要素数の情報は無い。

二次元以上になって、要素数が必要になるんだが、Cの多次元配列ってのは
要するに配列の配列だったりするから、最後の配列の分だけは要素数が
要らない。それ以外の要素数がいるのは、その配列に格納する要素のサイズ
を知るのに必要だから。


287デフォルトの名無しさん:2005/06/25(土) 19:25:15
>>283
confllicting type for data ってことは、data の定義がコンフリクトしてる、ってことだよね。
グローバル変数とかで data ってキーワードをなにかに使ってない?
とりあえず、その関数内の data っていう名前を別のに変えてみたら?
288デフォルトの名無しさん:2005/06/25(土) 19:26:48
で、
int a[M][N];
int (*p)[N] = a;

とすれば、

for (i = 0; i < M; ++i)
  for(j = 0; j < N; ++j) {
    p[i][j] = ...:
  }
}

のように、要するに普通に二次元配列を使うのと同じやりかたで使えるよ。
289デフォルトの名無しさん:2005/06/25(土) 19:31:38
>>286 >288
あー、わかりました。
int (*p)[4] の 4 は、二次元目の 4 なんですね。
一次元目の 4 は特に指定する必要が無いと。

でも、sizeof(*p) は意図した値にはならないですね・・・
290デフォルトの名無しさん:2005/06/25(土) 19:34:00
>>289
一次元配列を指すただのintのポインタから、配列のサイズは取れんだろ
それと同じ
291 :2005/06/25(土) 19:36:19
#include <stdio.h>
#include <string.h>

struct profile{
char sex[5];
char name[10];
char adress[100];
char telnum[20];
int old, height, weight;
};

int main(void){
struct profile member[5];
int i;
for(i=0; i<4; i++){
printf("プロフィールを入力してください\n");
printf("性別\n"); scanf("%s", member[i].sex);
printf("名前\n"); scanf("%s", member[i].name);
printf("住所\n"); scanf("%s", member[i].adress);
printf("電話番号\n"); scanf("%s", member[i].telnum);
printf("年齢\n"); scanf("%d", member[i].old);
printf("身長\n"); scanf("%d", member[i].height);
printf("体重\n"); scanf("%d", member[i].weight);

}
292 :2005/06/25(土) 19:36:42
for(i=0; i<4; i++){

printf("プロフィールを表示します\n");
printf("性別:%s", member[i].sex);
printf("名前:%s", member[i].name);
printf("住所:%s", member[i].adress);
printf("電話番号:%s", member[i].telnum);
printf("年齢:%d", member[i].old);
printf("身長:%d", member[i].height);
printf("体重:%d", member[i].weight);
}
return;
}
293 :2005/06/25(土) 19:37:38
コンパイルは通るんですが年齢を入力するとエラーが出ます
なぜでしょうか?
294デフォルトの名無しさん:2005/06/25(土) 19:39:14
>>290
たしかにそれはもっともなのですが、malloc するのに sizeof 一発でサイズが取れた方が便利ですよね。
というときには、

int (*p)[N][M] = malloc(sizeof(*p));

使うときには

*p[i][j] = xxx;

みたいに使うことになりますよね。

int (*p)[M] = malloc(sizeof(p) * N);

だとサイズの取得部分が煩雑な気もしますし、一方で

p[i][j] = xxx;

で使えるのはスマートだし、
うーむ・・・


295デフォルトの名無しさん:2005/06/25(土) 19:39:15
scanf("%d, &member[i].old);
身長と体重も同様にな
296 :2005/06/25(土) 19:43:16
>>295
サンクスです。初歩的なミスですいません。初心者なんで
297デフォルトの名無しさん:2005/06/25(土) 19:44:17
>>294
そもそも三次元配列を指すポインタで二次元配列を操作するのは型的に
正しくない。

int a[M][N];
int (*p)[M][N];
で、p = a;
とはできんし、p[i][j]と書けないのは、そういうこと。

malloc()うんぬんは、コードで言うとただの一行だけの問題だから、
瑣末な話と考えるが。
298デフォルトの名無しさん:2005/06/25(土) 20:00:03
>>297
その辺の理解はできてきたつもり。
ただ、これは配列だからそういう数通りの書き方があって、その解釈をどうするのか、という問題になるけど、
たとえば structure の場合、

MYSTRUCT a;
MYSTRUCT *p;

p = a;
とはできないし、p.member とも表現できないのと同じなのではないでしょうか?
二重配列のメモリ領域を指し示すポインタと、二重配列そのものとして振舞うポインタとはちょっと意味が違って、
この辺はプログラマが意図に応じて定義を意味的に正しく使い分けるべきではないかと思いました。
それを踏まえて、自分のケースにおいてどちらが適切かよく考えてみます。
ありがとうございました。

# malloc の一行だけではなく、memcpy したり通信したりでサイズを取得する機会は多いです
299274:2005/06/25(土) 20:04:37
>>287

やはりdataの名前を変えても同じエラーがでます

ああ いったい原因はなんなのだろう!
300デフォルトの名無しさん:2005/06/25(土) 20:17:41
>>299
とりあえず関数の変数宣言のところを一通り抜き出してみたらどうかな。
MYDATA *data って、関数のローカル変数なんだよね?
301274:2005/06/25(土) 20:42:51
>>300

今はグローバル変数として宣言してます
宣言部は以下のような感じです

#include<stdio.h>
#include<stdlib.h>


#define D(a) fprintf(stdout,"-------------------debug %d--------------------\n",a)

#define MAX_DATA_NUM 40000
#define MAX_IMAGESIZE 1024 /* 縦・横の最大画素数 */
#define MAX_BRIGHTNESS 255 /* 最大階調値 */
#define MAX_FILENAME 256 /* ファイル名の最大長 */
#define MAX_BUFFERSIZE 256 /* バッファ最大長 */

static int matrix_size;

typedef struct mydata{
unsigned int matrix[MAX_DATA_NUM][3];
unsigned char image1[MAX_IMAGESIZE][MAX_IMAGESIZE];
unsigned char image2[MAX_IMAGESIZE][MAX_IMAGESIZE];
}MYDATA;

MYDATA *data;

data = (MYDATA * )malloc(sizeof(MYDATA));

int x_size1, y_size1,x_size2, y_size2;
302デフォルトの名無しさん:2005/06/25(土) 20:46:12
それはCのソースなのか?

関数の外側の宣言部で
data = malloc(...)
はマズいだろ

君はmain()を書かずに全部のプログラムを書く気か
303デフォルトの名無しさん:2005/06/25(土) 20:47:23
>>301
そんなところに malloc 置いちゃだめだよ。
MYDATA をローカル変数にして、関数の中で malloc しな。
typedef はその位置でもいいけど、最初のグローバル変数宣言の前、#define 群の次くらいがいいんじゃないかな?
304デフォルトの名無しさん:2005/06/25(土) 21:04:41
>>302
>main()を書かずに

その手があった!
今、お前のおかげで全然関係ない問題を解くことが出来そうだ
305デフォルトの名無しさん:2005/06/25(土) 21:07:14
>>304
C++?制御系?それともWinMain()?(ワラ
306274:2005/06/25(土) 21:09:26
>>302
>>303

どうもありがとうございます
ひとつ常識を学ばせていただきました!
307デフォルトの名無しさん:2005/06/25(土) 21:17:25
>>305
ライブラリじゃねぇべか?
308デフォルトの名無しさん:2005/06/25(土) 21:17:42
>>305
制御
309デフォルトの名無しさん:2005/06/25(土) 21:38:41
先ほどもお世話になったものですが
またまた壁にぶつかってしまいました

1 1 1
1 1 1
1 1 1

のように数字が三つならんでいるファイルから数字を読み,
それを配列にいれたいのですが,なぜか入っている数字を
出力すると2289044等のなぞの数字がでてきます

どなたか落ちからぞえを.
char buffer[MAX_BUFFERSIZE];
unsigned int matrix[MAX_DATA_NUM][3];
for(;i < matrix_size;i++) {
if(buffer[0] != '#'){
fgets(buffer, MAX_BUFFERSIZE, fp);
sscanf(buffer, "%d %d %d", &x, &y, &gray_scale);
fprintf(stdout, "%d %d %d\n", &x, &y, &gray_scale);
matrix[i][0] = x;
matrix[i][1] = y;
matrix[i][2] = gray_scale;
}
}
310デフォルトの名無しさん:2005/06/25(土) 21:41:24
>>309
printf では、数値の出力時に渡すのはポインタじゃないよ。
変数につけた & を取ればよろしい。
311デフォルトの名無しさん:2005/06/25(土) 21:50:02
>>310

うぐぅ ありがとうございます
馬鹿な間違いをしてすいません 先生
312デフォルトの名無しさん:2005/06/25(土) 23:20:56
a>>bってどういう意味ですか?
313デフォルトの名無しさん:2005/06/25(土) 23:22:08
>>312
aをbだけビットシフトするだなんてふざけるな!
いつからビットシフトすることになったんだよ!
314デフォルトの名無しさん:2005/06/25(土) 23:27:25
ビットシフトですか!初めて知りました
「>>」はどっちにシフトするんですか?
315デフォルトの名無しさん:2005/06/25(土) 23:29:53
>>314
直感的にこっちと感じる方向があるだろ。
316デフォルトの名無しさん:2005/06/25(土) 23:30:09
>>314

数が小さくなる方
317デフォルトの名無しさん:2005/06/25(土) 23:34:35
だからビットシフト馬鹿を相手にするなって
318デフォルトの名無しさん:2005/06/25(土) 23:34:49
お手数をかけました
ありがとうございました
319デフォルトの名無しさん:2005/06/25(土) 23:35:36
シフトだけじゃなくてローテートもあればいいんだけどなぁ・・・
320デフォルトの名無しさん:2005/06/25(土) 23:36:24
>>315
>直感的にこっちと感じる方向があるだろ。

ところで、明日はどっちですか?
321デフォルトの名無しさん:2005/06/25(土) 23:36:50
>>319
ああ、それは良く思う。
322デフォルトの名無しさん:2005/06/25(土) 23:41:10
2分木を前順になぞって出力する関数は下のように書いたんですけど、
中順、後順でなぞって出力する関数はどういう風に書いたらいいですか?
っていうか、プログラムのこの部分だけじゃ書けないですかね…

void walkNode(stNode* lpSt){
/*2分木を前順でなぞっていくwalkNode関数の内容*/
printf("%c, ",lpSt->nodename); /*2分木の要素を出力*/
if(lpSt->left) walkNode(lpSt->left); /*子左側を再帰的に呼び出す*/
if(lpSt->right) walkNode(lpSt->right); /*子右側を再帰的に呼び出す*/
}
323デフォルトの名無しさん:2005/06/25(土) 23:43:10
printfを1つ目のifの後においてみたり2つ目のifの後においてみたり
してみ?
324デフォルトの名無しさん:2005/06/25(土) 23:58:44
>>323
ありがとうございます!
へぇ…2つとも簡単にかけるんですね…。もう一回勉強しなおさなければ…
325デフォルトの名無しさん:2005/06/26(日) 00:01:02
>>324
前順ってどんな順?
ついでに、中順、後順ってどんな順?
左の先端からが前順だとすれば、>>322 のコードはおかしくない?
326デフォルトの名無しさん:2005/06/26(日) 00:17:37
なんで、誰も突っ込まないんだ…

>>255
> void klt_data()
> {
>  D('z');
>  FILE *fp;
>
> あ Dはprintfですー

printf()の呼び出しの後に変数宣言は出来ないだろう。
327C99:2005/06/26(日) 00:18:34
 
328デフォルトの名無しさん:2005/06/26(日) 00:29:41
>>326
(´・ω・`)
329デフォルトの名無しさん:2005/06/26(日) 01:30:49
できないCもあるな
330デフォルトの名無しさん:2005/06/26(日) 01:33:00
出来ないほうが多いな。
331デフォルトの名無しさん:2005/06/26(日) 01:33:25
問題の本質はそこじゃないからだれも突っ込まないんだろ。
コンパイルが通りませんって質問ならまだしも。
332デフォルトの名無しさん:2005/06/26(日) 01:41:47
さっき妹がいるはずの居間に行こうとしたら電気カミソリの動作音のような音が聞こえて引き返してきたのですが、僕はこの後どうすべきでしょうか?
333デフォルトの名無しさん:2005/06/26(日) 01:45:11
素っ裸で居間に乗り込み、小刻みにジャンプしながら「僕は能登真美子ちゃん!」と何度も叫ぶ。
334デフォルトの名無しさん:2005/06/26(日) 11:15:45
ねぇもしかして
ポインタをいったんNULLってしたら
そのポインタにアドレス覚えさせることはもうできない?
そんなんだとシュクダイ終わらないんだがどうしよっか?
335デフォルトの名無しさん:2005/06/26(日) 11:18:41
なんだかよく分かりませんが、そんなんだと
ジェダイだかシュクダイも終わりそうにないですね。
336デフォルトの名無しさん:2005/06/26(日) 11:19:29
ポインタ変数のことなら、ほかにもうひとつポインタ変数を用意して、そっちにアドレスを保存しておけばいい。
337354:2005/06/26(日) 11:20:28
実際どうなの?
けっこー困ってる
ボーランドのフリーのやつ使ってんだが
動いてくれないんだよな
338sage 334:2005/06/26(日) 11:22:13
>336
即スレサンクス
それ使って考え直しますわ
339デフォルトの名無しさん:2005/06/26(日) 11:27:16
>>334
死んどけ。つーか、真面目に質問したいなら宿題スレか初心者スレにでも逝け。
340デフォルトの名無しさん:2005/06/26(日) 13:45:25
データ表現としての2分木の長所って何かありますか?
自分が考えたのは、長男次弟方式による実現によって任意の木を2分木にできるっていうものなんですけど…
他に何かあったら教えてください
341デフォルトの名無しさん:2005/06/26(日) 14:09:15
長所:とくになし
趣味:アニメ鑑賞、枝刈
血液:log型
342デフォルトの名無しさん:2005/06/26(日) 14:11:02
C言語の本を読んでたらポインタのところで->という記号が出てきます。A->Bとか。これはどういう意味なんですか?
343デフォルトの名無しさん:2005/06/26(日) 14:12:22
ポインタAの指し示すオブジェクトのメンバB
344デフォルトの名無しさん:2005/06/26(日) 14:12:46
(*A).B
のこと
345デフォルトの名無しさん:2005/06/26(日) 14:13:04
>>342
構造体へのポインタから構造体のメンバを参照するときに使う。
(*A).Bと同じだとか書いていなかったか?
346デフォルトの名無しさん:2005/06/26(日) 15:20:43
ソースコードを読んでてわからないので質問させてください。現在、libxcastのmember.cというライブラリを読んでいます。
以下の関数についてわからない点があるので、誰か教えてください。
/*
static int
Xcast6GetSrc(struct xcast_group *g, struct sockaddr_in6 *dst)
{
int fd;
int ret;
int i, found;
struct sockaddr_storage src, dstn;
struct sockaddr_in6 dstd, *sin6;
socklen_t len;
SOCKET_ADDRESS_LIST *psal;
DWORD alen;

fd = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
if (fd < 0)
return fd;

dstd = *dst;
dstd.sin6_port = htons(DISCARD_PORT);
ret = Xcast6NormalizeAddr(&dstd, &dstn, &len);

*/
変数"len"と"dstn"が初期化されてないまま使用されているのですが,これはどういう意味なんでしょうか?
オリジナルのソースはい次の場所にあります。
http://sourceforge.net/project/showfiles.php?group_id=30760&package_id=22808

僕自身のレベルは、UNIXのechoコマンドが読める程度と考えてください。
ご教授お願いします。
347デフォルトの名無しさん:2005/06/26(日) 15:23:12
>>346
Xcast6NormalizeAddrの中で値を参照することなしに代入しているのではないだろうか。
348デフォルトの名無しさん:2005/06/26(日) 15:24:33
引数で受け取ってるだけやん
349デフォルトの名無しさん:2005/06/26(日) 15:33:40
346です
347,348さん、ありがとうございます。
すいません。Xcast6NormalizeAddrのなかをざっと検索したところ
関数内で初期化してました。
変数を宣言するだけだと、メモリに領域を取るだけで、その領域にはゴミがあるという
話を以前に聞いたことがあったので、なぜゴミを参照するのか疑問に思ったので質問させてもらいました。
こんな書き方あるんですね。
というか、あんがい普通だったりするんでしょうか?
今度からは、もうちょっと慎重に原因追求してから質問させていただきます。
本当に申し訳ありませんでした。
350デフォルトの名無しさん:2005/06/26(日) 15:54:40
>>349
> というか、あんがい普通だったりするんでしょうか?
ごくごくふつう。

関数Aに変数Bのアドレスを渡したからといって
Aの中でBの値を参照しているとは限らないわけで、Bを更新しているだけなら
Bの値が初期化されていなくても問題ないわけだ。
そういうのをout引数と言ったりする。
351349:2005/06/26(日) 16:04:25
350さん、ありがとうございます。
out引数と言うんですか。
自分でも恥ずかしい質問をした(よく調べればわかるという点で)と思っているのですが
またひとつ勉強になったので、得るものが大きかったです。
ありがとうございます。
352デフォルトの名無しさん:2005/06/26(日) 17:09:52
まぁあれだ、VBやったことあるならByValとByRefの違いだな。
353349:2005/06/26(日) 17:22:31
そう言われるとよくわかります(笑)
354デフォルトの名無しさん:2005/06/26(日) 17:34:43
355349:2005/06/26(日) 17:46:15
ソースまでいただけるなんて。
ありがとうございます。
これだけのことをしていただいたのですから
最後まであきらめずにコードを読みきりたいと思います。
本当に感謝しています。
356デフォルトの名無しさん:2005/06/26(日) 18:07:54
x^nを求めるプログラムを書いたのですが、もっと行数を減らせませんか?
ttp://tool-ya.ddo.jp/2ch/trash-box/file/20050626180602201.txt
357デフォルトの名無しさん:2005/06/26(日) 18:14:10
>>356
とりあえずif文の無駄な{}を減らす。
358デフォルトの名無しさん:2005/06/26(日) 18:15:26
n==0,1のときzいらねーし
359デフォルトの名無しさん:2005/06/26(日) 18:23:07
>>358
ではどのようにすればいいのでしょうか?
360デフォルトの名無しさん:2005/06/26(日) 18:37:50
質問文だけだったら pow 使って一発とか言ってしまいそうだ。
>if(n>=2)
ここが else if になっていないところが分かっててやってんじゃないのか?という疑念を誘われるところだが、
for 文をこの前に持ってこい。
あと、abs だが (X)*-1 にするより (-(X)) にする方がいいんじゃないの?
361デフォルトの名無しさん:2005/06/26(日) 18:41:02
>>356
こんなんでどう?
double pow2(int x, int n) {
    unsigned int bit = 1 << sizeof(int) * CHAR_BIT - 1;
    double a, result = 1.;
    if (n > 0) a = x;
    else {
        a = 1. / x;
        n = -n;
    }
    do {
        result *= result;
        if (bit & n) result *= a;
    } while (bit >>= 1);
    return result;
}
362デフォルトの名無しさん:2005/06/26(日) 18:44:44
ひんと
double pow2(int x, int n)
{
if(n<0) reutrn 1 / pow2(x, ?????);
if(n==0) ?????;
// if(n==1) ?????; // なくてもいい
?????
}
363デフォルトの名無しさん:2005/06/26(日) 18:45:38
double z=1;
int i;
for(i=1;i<abs(n);i++)
z*=x;
return (n>=0)?(double)z:(double)1/z;
364デフォルトの名無しさん:2005/06/26(日) 18:47:01
return の (double) イラネ
365356:2005/06/26(日) 19:03:04
>>360
あとでforを挟もうと思って忘れてました;
absに関してはそうします。

>>361
unsignedとかsizeofとか知らないので調べつつ読んでます。

>>362
n==0,1はmain内で処理するということですか?
だとすると、関数ごとの役割が曖昧になるので嫌です。

>>363
>for(i=1;i<abs(n);i++)
こうすると私の環境では無理でした。
最後の行は参考にさせていただきます。

>>364
確かに"1/z"以外はいりませんね。
ありがとうございます。
366デフォルトの名無しさん:2005/06/26(日) 19:24:14
掛け算
a×b
(例)4×7=21

#include <stdio.h>

int main(void)
{
char a,b,i,ans;
a=4;
b=7;
ans=0;
for(i=0;i<b;i++){
c += a;
}
printf("a×b = %d",ans);
}

↑これを、ビット列を使ったコードに書き換えたいのだが… どうすればいいでしょうか?><;
367361:2005/06/26(日) 19:24:26
>>365
>>362のアドバイスを基に改良
double pow2(int x, int n) {
    unsigned int bit = 1U << sizeof(unsigned int) * CHAR_BIT - 1;
    double result = 1.;
    if (n < 0) return 1./pow2(x, -n);
    do {
        result *= result;
        if (bit & n) result *= x;
    } while (bit >>= 1);
    return result;
}
368デフォルトの名無しさん:2005/06/26(日) 19:25:09
>>366
> ビット列を使ったコード
これは具体的にはどういうこと?
369デフォルトの名無しさん:2005/06/26(日) 19:25:19
>>367
汚い
370↑訂正します:2005/06/26(日) 19:26:47
int main(void)
{
char a,b,i,ans;

a=4;
b=7;
ans=0;
for(i=0;i<b;i++){
ans += a;
}
printf("a×b = %d",ans);
}
371デフォルトの名無しさん:2005/06/26(日) 19:29:18
はじめまして。物凄く初心者なので、分からなかったので教えてください。
A.txtというファイルから2桁の整数を3回読み込んで、
fgetcを使って総和を求めたいのですが、10の位と1の位の区別ができません。
宜しければ、区別の仕方を教えてください。
372356:2005/06/26(日) 19:34:02
暫定的に↓のようになりました。
>>361さんのコードを参考に又変えるかもしれませんが、ありがとうございました。

double pow2(int x,int n)
{
int n2,i,z=x;
n2=abs(n);
if(n==0)
return 1;
else if(n==1)
return x;
for(i=1;i<n2;i++)
z*=x;
return (n>=2)?z:(double)1/z;
}
373デフォルトの名無しさん:2005/06/26(日) 19:35:04
fgetcを使って読み込むならばともかくも、fgetcを使って総和を
求めたいとは何事!
374うんこプログラマ:2005/06/26(日) 19:35:59
>>368

>>370は、掛け算を「*」を使わずに、「a を b 回 加算」して答えを求めています。
ですが、私は、これを、シフト演算を用いたコードに書き換えたいのです。

例えば、2×4は、00000010を左に2ビットシフトして、00001000と出来ますよね?
これを、例えば、4×7や5×3など、の計算もできるようにしたい。><; 
375デフォルトの名無しさん:2005/06/26(日) 19:36:43
>>372
そのコードはabs(n)回の掛け算を行うが、>>361==>>367のコードは
掛け算の回数がもっと少ない。
376デフォルトの名無しさん:2005/06/26(日) 19:39:58
>>374
ひんと1:二進数に変換するアルゴリズム
ひんと2:4*7=(4>>2)+(4>>1)+4
377デフォルトの名無しさん:2005/06/26(日) 19:40:44
>>373すいません、説明がへたで。
fgetcで読み込んで、読み込んだ2桁の数字を
足していき、総和を求めたいという事です。
378デフォルトの名無しさん:2005/06/26(日) 19:46:40
>>374
懲りずに失礼
#include <stdio.h>
#include <limits.h>
int mul(int a, int b) {
    unsigned int answer = 0, bit = 1U << sizeof(unsigned int) * CHAR_BIT - 1, ua = a > 0 ? a : -a, ub = b > 0 ? b : -b;
    do {
        answer <<= 1;
        if (ub & bit) answer += ua;
    } while (bit >>= 1);
    if (a > 0 && b < 0 || a < 0 && b > 0) answer = -answer;
    return answer;
}
int main(void) {
    printf("%d", mul(3, 7));
}
379デフォルトの名無しさん:2005/06/26(日) 19:59:10
double pow2(int x,int n)
{
int n2,i,z=1;
n2=abs(n);
for(i=0;i<n2;i++)
z*=x;
return (n>=0)?z:(double)1/z;
}
380デフォルトの名無しさん:2005/06/26(日) 20:13:51
>10の位と1の位の区別
なぜしたいの?
381356:2005/06/26(日) 20:22:56
>>379
おお!
そんな方法があったんですね。
ありがとうございました!
382デフォルトの名無しさん:2005/06/26(日) 20:28:24
計算して総和を出すとして、txtに35という数字があった場合
fgetcでは区別しなければ、計算できないと思ったからです。
他に方法があるのであれば教えて頂けませんか?お願いします。
383デフォルトの名無しさん:2005/06/26(日) 20:30:10
>>382
scanf使えw
384デフォルトの名無しさん:2005/06/26(日) 20:35:25
>>382さん
scanfは使わないでという事なんですが。
問題としてはtxtから2桁の数字を読み込んで、
それを宣言しておいた値に入れていき、全て読み込んだら
終了して、総和を出すという物なんですが。
本当にすいません。
385デフォルトの名無しさん:2005/06/26(日) 20:36:41
宿題か?
386デフォルトの名無しさん:2005/06/26(日) 20:43:52
>>384
ヒント:35=3×10+5
387デフォルトの名無しさん:2005/06/26(日) 20:44:08
>>371
/* 負の数は非対応 */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, char **argv)
{
  int ch, sum, n;
  FILE *fp;
  if( argc < 2 ||  NULL==( fp = fopen(argv[1],"r")))
  {
    perror("fopen");
    return EXIT_FAILURE;
  }
  sum = n = 0;
  while( EOF != ( ch = fgetc(fp)))
  {
    if( isdigit( ch ) )
    {
      n = n * 10 + ch - '0';
    }
    else if( n != 0 )
    {
      sum += n;
      n = 0;
    }
  }
  printf("総計 : %d\n", sum);
  fclose(fp);
  return EXIT_SUCCESS;
}
388デフォルトの名無しさん:2005/06/26(日) 20:45:21
sscanf使え
389デフォルトの名無しさん:2005/06/26(日) 20:46:02
宿題とは違うのですがC言語の勉強を始めて、ネットに
こんな感じの問題があったのですが、PCを換えてたら
サイトがもうなくて答えが分からないまま今の状態に
なったというわけなんです。
390デフォルトの名無しさん:2005/06/26(日) 20:49:25
>>387さんありがとうございます!
それでためしてみます。本当にありがとうございます。
391うんこプログラマ:2005/06/26(日) 21:20:46
>>376
>>378
ありがとうございました!なんとお礼を言って良いやら…

392デフォルトの名無しさん:2005/06/26(日) 21:21:41
今度からはその口調に見合ったHNにしてくれ。
393デフォルトの名無しさん:2005/06/26(日) 21:31:04
C++を勉強すれば基本的にはCも身につけることができるの?
それともまったく別物?
394デフォルトの名無しさん:2005/06/26(日) 21:33:18
>>393
別物でもないけど自動的にってほどでもない。
C++からCの関数を利用する方法を知ってればさしあたり十分。
395デフォルトの名無しさん:2005/06/26(日) 21:35:12
似て非なるもの。
まずはCの構文や、標準関数を一通り使えるようになってから、
C++ へ進むことをお勧めしておく
396デフォルトの名無しさん:2005/06/26(日) 21:35:51
推奨されるアプローチが違う。
397デフォルトの名無しさん:2005/06/26(日) 21:36:38
>>393
C89なら、100%じゃないけどC++のサブセット。
だから、C++を勉強すればCの仕様の大半は理解したことになるんだが
C++だけをやっていたのでは、そのサブセットの範囲、限界、差異といったものは
意識することが無いだろう。だから、Cもやってみないと、身にはつかないと
思う。ま、C++を理解したんなら、すぐだけどね。
398デフォルトの名無しさん:2005/06/26(日) 21:36:56
>>393
まったく別物だと思った方がC++を勉強しやすいと思う。
399デフォルトの名無しさん:2005/06/26(日) 21:45:19
>>394-398
ありがとう
400デフォルトの名無しさん:2005/06/26(日) 21:50:29
そういや俺らが大学に行ってたころ(10年前)は
Cさえ押さえれば、他の言語にも入りやすいからって理由で
全員必修として「C」+オプションで他の言語って形だったけど
今でもそうなのかね?

当時はJavaもなかったし、それが妥当だったのかも知れないけど
401デフォルトの名無しさん:2005/06/26(日) 21:51:11
このスレのFAQまとめたようなサイトはないんかいな
402デフォルトの名無しさん:2005/06/26(日) 21:53:30
>>401
CFAQでは不満なのか
403デフォルトの名無しさん:2005/06/26(日) 21:57:03
>393なんてでまくってそうな質問に思えるが。
404デフォルトの名無しさん:2005/06/26(日) 21:58:46
関係ないですけど、↓の問題分かりませんか?
100 PRG030 START
110 LD GR1,A
120 ADDA GR1,A
130 ADDA GR1,A
140 ST GR1,WK
150 ADDA GR1,WK
160 ST GR1,WK
170 RET
180 A DC 4
190 B DC 8
200 WK DC 1
210 END
実行後のGR1を16進数で記述せよ。
140,150行目を1命令で記述せよ。
405デフォルトの名無しさん:2005/06/26(日) 21:59:33
>>403
FAQかもしれないが、唯一の正解のない質問だな
そういうのはFAQ向きじゃないと思われ
406デフォルトの名無しさん:2005/06/26(日) 22:00:34
正解が一つかどうかは関係ないと思うがないのはわかった
407デフォルトの名無しさん:2005/06/27(月) 00:43:59
>>404
それCASL?
ST GR1, WK
ADDA GT1,WK
ってことは、ようするに GR1 を 2倍するってこと?
408デフォルトの名無しさん:2005/06/27(月) 03:52:08
C言語で文字定数の型がint型なのは何故ですか?
409デフォルトの名無しさん:2005/06/27(月) 03:57:57
>>407
相手しないように。
410デフォルトの名無しさん:2005/06/27(月) 08:33:13
>>408
EOF
411デフォルトの名無しさん:2005/06/27(月) 15:41:43
>>408
式の値を評価する際にはどうせintに拡張されるから
じゃまいか。
412デフォルトの名無しさん:2005/06/27(月) 15:44:10
>>411
アフォは黙っててください
413デフォルトの名無しさん:2005/06/27(月) 15:56:05
>>412
じゃあアフォの俺にもわかるように
おしえてけれ
414デフォルトの名無しさん:2005/06/27(月) 15:57:31
415デフォルトの名無しさん:2005/06/27(月) 15:58:41
EOFは文字定数じゃないと思うんだが
416デフォルトの名無しさん:2005/06/27(月) 16:14:17
文字定数以外を表せないだろ
417デフォルトの名無しさん:2005/06/27(月) 16:17:13
>>416
はぁ?
こいつ、むちゃくちゃ馬鹿だ

「文字定数の型」を問題にしているのに、「文字定数以外を表せない」
ことに何か問題があるのか?
418デフォルトの名無しさん:2005/06/27(月) 16:18:17
>>416は文字定数の意味を理解していないに100ペリカ
419デフォルトの名無しさん:2005/06/27(月) 16:53:26
ドングリの背比べ
420デフォルトの名無しさん:2005/06/27(月) 18:42:01
つーか、sizeof('a')とかやってみろって話。
421デフォルトの名無しさん:2005/06/27(月) 18:59:37
で、推測じゃないちゃんとした答えは?
422デフォルトの名無しさん:2005/06/27(月) 19:02:06
ある文字列を渡してその中の全角スペースを カンマ などに置換する関数を作りたいのですがどうすればいいのですか?
423デフォルトの名無しさん:2005/06/27(月) 19:07:19
>>421
お前の目は節穴か?
424デフォルトの名無しさん:2005/06/27(月) 19:08:29
>>422
エスケープシーケンスで判断することになると思いますが、
文字コードに依存します。
425デフォルトの名無しさん:2005/06/27(月) 19:13:03
>>423
EOFの事を言ってるなら
標準ライブラリの仕様に合わせるために言語仕様を決めたというソースは?
426デフォルトの名無しさん:2005/06/27(月) 19:18:14
'abcd'と互換性保ちたかったんじゃないの?
427デフォルトの名無しさん:2005/06/27(月) 19:32:14
X3010:2003(ISO/IEC 9899:1999)には
単純文字定数は、型intをもつ。
と定義されてあるそれ以上でもそれ以下でもない。
428デフォルトの名無しさん:2005/06/27(月) 19:45:37
何故なのかと理由を問うているのに規格で決まっているからってアホですか?
429デフォルトの名無しさん:2005/06/27(月) 19:45:43
よくわからんが、int型と定義したのには何らかの理由があったと思うんだけど。
直感的にchar型でも良さそうなのに。
実際、C++だとchar型と定義されていてC言語と定義が違うし。
430デフォルトの名無しさん:2005/06/27(月) 19:50:02
>>428
44ペイジあたりを読んでみろよ。
431デフォルトの名無しさん:2005/06/27(月) 19:53:38
charは符号(MSB)が未定義だから、符号付の場合、'ア'とかが負の値になって、
なんか知らないけど、困るんじゃね?
違うかな・・。
432デフォルトの名無しさん:2005/06/27(月) 20:45:23
>>429
charやshort、それらのunsignedの右辺値は常にint/unsigned intに昇格される規則があり、
int/unsigned int未満の型の右辺値は存在しないことになっているから、
文字定数の型はは昇格済みの型のintにしたのではないかと思う。

C++で文字定数がcharになったのは関数の多重定義の都合上。(shortやcharなどの右辺値も存在する)
433デフォルトの名無しさん:2005/06/27(月) 22:01:30
#include <stdio.h>

void main()
{
int score[6];
int sangoukei;
int goukei;
double heikin;
int i;
char kyoukaname[][30]={"国語","数学","英語","公民","世界史","理科"}

i=0;
while (i<4)
{
printf("%c:",kyoukaname[i]);
scanf ("%d",score[i]);
sangoukei +=score[i];
i++;
}

while (i<7)
{
434デフォルトの名無しさん:2005/06/27(月) 22:01:41
printf("%c:",kyoukaname[i]);
scanf ("%d",score[i]);
sangoukei +=score[i];
goukei +=sangoukei+score[i];
i++;
}

heikin=(double)goukei/i;
printf("3教科合計:%3d 全教科合計:%3d 平均値:%3d\n",sangoukei,goukei,heikin);
}
12行目と26行目でコンパイルエラーです。
初めて3日。独学なので質問できません。。。
どうかナイーブに直しかたおせえてくらはい。
435デフォルトの名無しさん:2005/06/27(月) 22:05:58
ソースが2つあって、
ソース1にデータAの中身を書き換えるプログラムを。
ソース2にはsleep( )で60秒間カウントするプログラムを作りました。

それでソース1を実行して、データAの中身を書き換えると
ソース2のsleep( )が動くようにしたいのですが、どうしたらいいでしょうか?
436デフォルトの名無しさん:2005/06/27(月) 22:06:24
>>434
まずはソース読め
質問する時は最低限エラーメッセージ書け
次に>>1を読め
そしてどっかいけ
437デフォルトの名無しさん:2005/06/27(月) 22:14:10
>>435
スレ違い
438デフォルトの名無しさん:2005/06/27(月) 22:14:38
>>433
12行目は宣言の終わりにセミコロンが無い。
残りはscanfを例えばこういう風に使ったことあるだろう。
int n;
scanf("%d", &n);
というわけでアドレス演算子を付けろ。
439デフォルトの名無しさん:2005/06/27(月) 22:19:25
>>424
遅れましたがヒントありがとうございます。
440433:2005/06/27(月) 22:53:16
ありがとうございます。すまんです。
441デフォルトの名無しさん:2005/06/27(月) 22:58:50
int aaa(int test[3][3])
{
・・・・
・・・・
・・・・
return test[0][3]
}

というようにリターンで配列を返すことってできますか?
442デフォルトの名無しさん:2005/06/27(月) 22:59:51
>>441
test は配列だけど test[0][3] は配列じゃないよ
443デフォルトの名無しさん:2005/06/27(月) 23:01:09
>>441
typedefすれば可
444デフォルトの名無しさん:2005/06/27(月) 23:01:20
あ、違いますね
test[0]を返すことが出来ますか?
と聞くべきでした
445デフォルトの名無しさん:2005/06/27(月) 23:03:10
aaaが返す型は配列ではないようだが。
446デフォルトの名無しさん:2005/06/27(月) 23:04:02
>>432
それ本当?前半の規則については知っているけど
C言語では char の符号は処理系定義だからというのが
理由だと思ってた。

C++ の char は必ず符号ありだから
文字定数のサイズが1バイトでも問題ない

基本文字集合は必ずCでもC++でも正数だから

あー両方正しいのかな
447441:2005/06/27(月) 23:08:09
int aaa(int test[3][3])
{
a=test[0][0]+test[0][1]+test[0][2];
b=test[1][0]+test[1][1]+test[1][2];

if(a>b)
return test[0];
else
return test[1];
}

このようなことをしたいと考えています
このように配列を返すことは可能ですか?
で伝わるでしょうか
448デフォルトの名無しさん:2005/06/27(月) 23:15:03
配列を返すってゆーか配列の先頭のポインタを返すってゆーか
449デフォルトの名無しさん:2005/06/27(月) 23:16:00
>>447
何を還したいんだ
450デフォルトの名無しさん:2005/06/27(月) 23:16:03
>>446
今X3014を読んだが、C++でもcharが符号ありかどうかは処理系定義になっている。
C++で文字定数がcharになった理由はD&Eにそう書いてある。
451デフォルトの名無しさん:2005/06/27(月) 23:16:15
>>441
int (* aaa(int test[3][3]))[3]{
return &test[0];
}
あえて書けばこうだけど、447を見る限りint *にしておくべき。
452デフォルトの名無しさん:2005/06/27(月) 23:16:32
>>447
戻り値の型をintからint *にしてみろ。
453446:2005/06/27(月) 23:21:31
>>450
C++ でも char の符号は処理系定義だったのか…
嘘言ってゴメソ

「にそう書いてある」の「そう」は>>432のことね?
D&E本買おうかな…
454デフォルトの名無しさん:2005/06/27(月) 23:28:03
ファイルをオープンする際に、
ファイル名を固定せずに、任意のファイルをオープンするようにはできるのでしょうか?
455デフォルトの名無しさん:2005/06/27(月) 23:29:13
fopen(str,"w");
とか
456デフォルトの名無しさん:2005/06/27(月) 23:46:24
>>455
その方法でできるんですか。
ありがとうございます。
457408:2005/06/28(火) 05:15:10
いろいろ教えていただきありがとうございます。
まだまだ勉強が足りないようです。
細かい仕様の部分の理解が足らないみたいです。
458デフォルトの名無しさん:2005/06/28(火) 10:18:08
C言語の初歩の方の質問です。
int n1, n2;

これはintn1,n2;では不可ですか?
また、int n1,n2;ではどうでしょうか?
スペースの使い方がよくわかりません。どなたか教えてください。
459デフォルトの名無しさん:2005/06/28(火) 10:20:49
前者は不可後者は可
a-zA-Z0-9_はつながってると判断されるからintn1という一つの変数(識別子)とみなされてエラーになる。
だからスペースによる区切りが必要
n1,n2は間に , があるから区切られてるとみなされて別々の扱いになる。
460デフォルトの名無しさん:2005/06/28(火) 15:18:11
>>458
たぶん>>458のintn1はたぶん間にTabがあるんだと思うよ。
判っていると思うけど
461デフォルトの名無しさん:2005/06/28(火) 16:13:26
C言語の勉強をしていてソートを始める前にオーダで
つまずいてしいました。そこで質問なんですが

関数f(n)を
F(n)=1+3+3^2+3^3+・・・+3^n
とする時、f(n)のオーダはO(3^n)である事を証明しなさい。

誰かおわかりの方教えて下さい。
462デフォルトの名無しさん:2005/06/28(火) 16:14:26
sprintf( str,"%s\n", str );

これって危険?
463デフォルトの名無しさん:2005/06/28(火) 16:25:53
>>461
対数を取って、定数項を消去して終わりだろ。
464デフォルトの名無しさん:2005/06/28(火) 16:39:14
>>462
恐らく大丈夫だろうけれども、安全である保障はない。
strcat(str, "\n");
とか
sprintf(strchr(str, '\0'), "\n");

char * p = strchr(str, '\0');
p[0] = '\n';
p[1] = '\0';
とでもするのがいいのでは?
465デフォルトの名無しさん:2005/06/28(火) 16:45:30
>>462
C99ではたしか引数にristrictが付いていた気がするからまずいと思う。

>>464
一番下違和感がある。それよりもchar *p = str + strlen(str);の方が見慣れた感じがする。
こんな単純なときなら迷わずstrcat()を使うけど。
466デフォルトの名無しさん:2005/06/28(火) 16:51:50
ESC[x;yH のほかに、
画面に出力した行を戻るやり方ってありますか?
XPでは出来ないみたいなんですけど。
467デフォルトの名無しさん:2005/06/28(火) 16:54:16
>>466
厳密にやりたいならスレ違い。

同じ行で先頭に戻るだけでなんとかなるなら、'\r'を出力してみるとか。
468デフォルトの名無しさん:2005/06/28(火) 17:18:00
独習Cが一通り終わって、一応C言語によるプログラミングが出来るようになった(?)ようなので
RS-232Cを使ってリモコンだらけの自宅のホームシアターをパソコンで制御出来るようにしたい
のですが、C言語でRS-232Cを制御するには一体どうしたら良いのでしょうか?
469デフォルトの名無しさん:2005/06/28(火) 17:19:31
>>459
ありがとうございます。
>>460
Tabってなんですか?
470デフォルトの名無しさん:2005/06/28(火) 17:19:47
>>468
厳密にやりたいならスレ違い。

COMをopenして読んだり書いたりしてみるとか。
471デフォルトの名無しさん:2005/06/28(火) 19:03:47
>>468
たいがいのOSではシリアルポートデバイス(WindowsならCOM1だとか)を開いて読み書きすることになるが、

ふつうはボーレート、スタート/ストップビット、パリティビット、etc....の細々した設定が必要になるんで、それだけじゃだめ。
で、その辺の設定の仕方は完全に環境依存。
472デフォルトの名無しさん:2005/06/28(火) 19:38:59
double fact(double n)
{
  return ((n == 0.0 ) ? 1: n * fact(n - 1.0));
}

これの意味を教えてください
 (n == 0.0 ) ? 1: の部分がよくわかりません
473デフォルトの名無しさん:2005/06/28(火) 19:40:52
>>472
それは三項演算子といって、if文みたいなもん

条件式?真の場合:偽の場合

みたいに書く
474デフォルトの名無しさん:2005/06/28(火) 19:44:20
>>473
ありがとうございます
475デフォルトの名無しさん:2005/06/28(火) 22:04:01
>472
蛇足だけど計算誤差があるから浮動小数点数で等値比較(==)するのは危険。
fabs(n) < 0.0001 とか -0.0001 < n && n < 0.0001 とか範囲比較する方が良いと思う。
476デフォルトの名無しさん:2005/06/28(火) 22:25:30
イプシロン
477デフォルトの名無しさん:2005/06/28(火) 22:27:18
1 abc
2 defg
3 hijk
-1 ****
0 1 10
0 2 34
1 2 55
2 1 28
-1 -1 0
1

上のようなデータが書かれたdatファイルがあり、これをプログラムで読み込んで、

 char型  x[****より上の要素の数(この場合3)][10]

   /        ヽ.
   | a b c     |
x   | d e f g    |
   | h i  j k    .|
   ヽ.        /

 int型  y[****より上の要素の数][****より上の要素の数]
   /       ヽ.
   | 0 10 34 .|
y  .| 0  0 55  |
   | 0 28 0   |
   ヽ.      /

  n = 1  (←一番下にあるデータ)

のように配列に格納するようなC言語ソースファイルを作ってもらえないでしょうか?
478デフォルトの名無しさん:2005/06/28(火) 22:33:20
宿題スレにいけばいいと思うよ
479デフォルトの名無しさん:2005/06/28(火) 22:58:33
宿題スレではスルーされてしまったようで、さらに期限も迫っているので
申し訳ないと思いながらもこちらにも書かせていただきました
480デフォルトの名無しさん:2005/06/28(火) 23:02:47
マルチはもっと嫌われるというのに。
481468:2005/06/28(火) 23:06:03
>>470>>471
どうもありがとうございます。独習Cをやっただけじゃどうにもならないみたいですね。
482初心者です:2005/06/29(水) 03:30:54
C言語に詳しい方、どうか助けて下さい。m(_ _)m
最近C言語に興味を持ち、『10日でおぼえるC言語入門教室』と言う本を購入し、
本書どうり試してみたのですが、
E2209 sample1.c 1:インクルードファイル’stdio.h’をオープンできない
警告 W8065 sample1.c 4:プロトタイプ宣言のない関数’printf’の呼び出し(関数 main)
***1 erros in Compile ***
となってしまい、本書の3ページから進めず困ってます。(;´Д`A ```
bcc32.cfgファイルは、
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
ilink.32.cfgファイルは、
-L"c:Borland\Bcc55\lib"
本書どうりやったのですが…。。。
私の¥2,200+税…。_| ̄|○
出版社のHPに相談したのですが返信もなく、本当に泣き入ってます…。(ノДT)アゥゥ
ちなみにsample1.cファイルは、
#include <stdio.h>
main() {
printf("Hello!");
return 0;
}
です。。。
C言語にお詳しい方、お教え頂けないでしょうか?
pathの設定も、最後に;C:\Borland\Bcc55\bin加えました。
私には原因がわからないのですが…。。。
C言語にお詳しい方、助言お待ちしてます。。。m(_ _)m
483デフォルトの名無しさん:2005/06/29(水) 03:35:04
>>482
-I"c:\Borland\Bcc55\include"
のパスは合ってるの?パスの意味が分からないなら、スレ基地外い。
484デフォルトの名無しさん:2005/06/29(水) 05:33:51
bccは動いてるんだから
bcc32.cfg.txtに一票
485デフォルトの名無しさん:2005/06/29(水) 08:49:55
拡張子を表示させる方法について (Windows XP)
http://blogs.dion.ne.jp/aceproject/archives/384603.html
486デフォルトの名無しさん:2005/06/29(水) 10:38:46
bcc32.cfg の内容を転記してるってことは、その本にはそのファイルの説明があったってことなんだろうな。
てことは、本をよく読めばどう設定すればいいのかも書いてあるんだろうが、その辺どうなの?
487デフォルトの名無しさん:2005/06/29(水) 13:12:43
C言語で二つの整数値を読み込んで後者が前者の約数であれば
BはAの約数です。と表示しそうでなければ
BはAの約数ではありません。と表示するプログラム教えてください
二つの整数を入力してください。
整数A:12
整数B:6
BはAの約数です。
こうなるようお願いします
なんか何回やってもうまくいかないんで
488デフォルトの名無しさん:2005/06/29(水) 13:21:15
小学校の算数からやりなおせ。
489デフォルトの名無しさん:2005/06/29(水) 13:24:11
どうやったか少しは晒してくれ。

判定はこんな感じでいいと思うが、どうか。
if (a % b==0){

scanfで&を忘れているみたいなオチを予想。
490デフォルトの名無しさん:2005/06/29(水) 13:24:45
いや教えてくださいよ
491デフォルトの名無しさん:2005/06/29(水) 13:39:26
492初心者です:2005/06/29(水) 15:18:50
C言語にお詳しい皆様、ありがとうございました。m(_ _)m

出版社の方から、.cfgファイル付きの返信がきました。
自分の作った.cfgファイルの種類はテキストドキュメントで、送って頂いた.cfgファイルはCFGファイルでした。。。
出だしつまずきましたが、これから本ともと取れる様がんばります!(`・ω・´)シャキーン
493デフォルトの名無しさん:2005/06/29(水) 15:22:28
494デフォルトの名無しさん:2005/06/29(水) 16:10:24
ANSI C で 文字列(便宜上この表現)の操作を行いたいのですが、
なにか参考になるWebページ、ライブラリなどないでしょうか?

ANSI Cだと、"string1" と "string2" の間の文字を切り出したい!
みたいなのでも、結構冗長な処理になっちゃいますよね・・・
495デフォルトの名無しさん:2005/06/29(水) 16:11:35
>>492
とりあえず真っ先に、
エクスプローラのメニューから「ツール」を選択
→「フォルダオプション」
→「表示」タブを選択
→「詳細設定」の中の「登録されている拡張子は表示しない」のチェックをオフ
しとけ。さもないと今後も同じような目にあう。
496デフォルトの名無しさん:2005/06/29(水) 16:43:20
>>494
ポインタ操作、sscanf()、snprintf()、<string.h>の関数などを適切に使い分けろ。
ただしマルチバイト文字を適切に処理するのは面倒なので、
日本語はUnicode化してワイド文字で扱ったほうがラク。

Cで文字列を扱う際に、メモリ管理がどうしても面倒になる点は、あきらめるしかない。
alloca()でいい場所では積極的にalloca()を使え。ただし非標準なので移植性には欠ける。

後は、正規表現ライブラリを使うも良し。

UNIX系OSならばPOSIX互換のものが大抵利用できるはずだが、
他のOSにも移植されており有名なのは
GNUのregex、PCRE、鬼車などかな

マルチバイト処理を考えてお勧めなのは鬼車。
ワイド文字を扱えるのは俺の知る限りboostのregexだがこれはC++用ということになる。
497デフォルトの名無しさん:2005/06/29(水) 16:44:15
いい加減すれ違いに構うなや。
bccなら専用スレがあったろう。
498デフォルトの名無しさん:2005/06/29(水) 16:46:43
>>494
>494の例だとCじゃなくても複雑だと思うが、「s1文字列のm文字目からn文字をs2文字列で置き換える」
なんて処理はCでも数行で書けるから冗長だとは思わんがなぁ。
#難解かどうかは別。
499デフォルトの名無しさん:2005/06/29(水) 17:11:50
C言語とC++とかの違いって何ですか?
500デフォルトの名無しさん:2005/06/29(水) 17:26:49
>>499
C++は
Simula67風のオブジェクト指向とCの性能が欲しかった人が
「クラスつきのC」なるものを作ったのがはじまりで、
その後機能拡張しつづけてこんなに大きくなりました

みたいな言語です

ベースはCですが、その他にクラス、継承、テンプレート、参照、インライン関数、
演算子オーバーロード、などなどといった、よりリッチな機能を提供します
501デフォルトの名無しさん:2005/06/29(水) 17:28:57
>>500
ありがとうございます。
これから始めるならC++の方がいろいろ利点がありそうですね。
502デフォルトの名無しさん:2005/06/29(水) 17:32:17
>>501
まずはCから入った方がいいんじゃないかな。
Cの標準関数を一通り使えるようになってからC++をやってはいかが?
503デフォルトの名無しさん:2005/06/29(水) 17:39:34
>>502
Cから始める場合でもBorland C++ Compiler 5.5を使えばよろしいんでしょうか?
504デフォルトの名無しさん:2005/06/29(水) 17:47:26
C++やるのにCの知識が必須。

というのは嘘。わざわざ遠回りせずにC++をやるがよい。
C++やる場合BCCは古いのであまりお勧めできない。
学習用ならCygwinのgccを、ツールを作るならVC++のツールキットかMingWinがよい。
505デフォルトの名無しさん:2005/06/29(水) 17:51:07
DigitalMarsもあるよ
506デフォルトの名無しさん:2005/06/29(水) 18:47:27
504さんを否定する訳じゃないけど、いろいろ道はあると思うんだよね。
個人的にはCを一通りやってから、RubyやPythonなどの超高級言語をやった方が
いろいろ経験できてよいんじゃないかと。
アセンブラを除けば最低級と最高級に近いものをかじるわけで、
その他のC++とかはその間に位置するわけだから。
単純にC++がやりたいんなら、そのままC++をやればいいんだけど、
プログラミングをやりたいんなら、いろいろ経験するほうがいい。
507デフォルトの名無しさん:2005/06/29(水) 18:52:05
>>506
やっぱCから入った方が覚えやすい気がする。
単純にC++よりも覚えることが少なくていいと思う。
実用的な面からも、まだCでの開発は多いから、どこまでがCで、どこからがC++なのかということを把握できていいんじゃないかな。
おれは BASIC→アセンブラ→C→C++、Java、etc. の順だったけど。
508デフォルトの名無しさん:2005/06/29(水) 18:56:39
おれはBASIC→C→アセンブラ→Perl、Python・・・かな。
実はC++は本読んだりしたけど、本格的に使ったことは一度もない。
高級スクリプト+Cの方がいい気がしちゃうんだよね。
仕事でやってるわけじゃないからだと思うけど。
509デフォルトの名無しさん:2005/06/29(水) 18:56:53
printf/scanfよりcout/cinの方がわかりやすいとは思わないのかよ。
char配列/ポインタはstd::stringよりやさしいか?
510デフォルトの名無しさん:2005/06/29(水) 18:58:24
言語を覚える順番なんて些細なことなんだから気にすんな。
511デフォルトの名無しさん:2005/06/29(水) 18:58:57
>>509
わかりにくいけど、わかってしまえば問題を生みにくい
ってとこかな
512デフォルトの名無しさん:2005/06/29(水) 19:16:54
アセンブラ使えないくせに、Cをやるのは無茶ですか?
513デフォルトの名無しさん:2005/06/29(水) 19:17:48
>>512
いいえ。
514501:2005/06/29(水) 19:42:42
いろいろ助言頂きありがとうございます。

OSは98なんですが、Microsoft Visual C++ Toolkit 2003はサポートしていないそうです。
98で使っている方はいらっしゃいますでしょうか?
515デフォルトの名無しさん:2005/06/29(水) 19:47:06
Win98でやろうとしたがそもそもインストール時にはじかれた。
516デフォルトの名無しさん:2005/06/29(水) 19:58:56
>>509
ポインタはC++でも重要なポイントなんだから、それをキッチリ勉強する上で C は適材じゃないかな。
文字列(メモリやポインタ)の操作なんて、学ぶところが多いでしょ。
まあ、高水準言語らしく低水準な部分は極力触らないようにするってのもいいと思うけど。
517デフォルトの名無しさん:2005/06/29(水) 20:03:50
>>514
Cygwin入れてgcc。
プログラミングに纏わる諸々の知識も身に付く代わりに敷居が高い罠。

つーか、言語相談でもコンパイラ相談でもスレ違いだ。
518デフォルトの名無しさん:2005/06/29(水) 20:06:37
わざわざCを使わずともC++でポインタの勉強はできると思うが。

C++なら本質的でない部分で随分ラクができるし
Cでしか必要でない下らないテクニックを覚える必要が無いし
手続き型的指向に染まってしまうことを回避できる

std::stringとSTL使えるだけでも随分違う。自分でリストやツリーを
作る、といったことも一度はやってみたほうが良いが、それをCで
やる必要はない。
519デフォルトの名無しさん:2005/06/29(水) 20:11:41
strxx 系、 memxx 系の理解はポインタ、メモリ操作の勉強になる。
C++じゃ、便利なライブラリがある分、ダイレクトな理解の妨げになるかもしれない。

Cの主要ライブラリなんて、高々2、30程度なんだから、一通り見ておいてもたいした労力ではなかろ。
520デフォルトの名無しさん:2005/06/29(水) 20:16:12
>>519
誰もlibcの関数を使うなとは言ってない
libcの関数はC++の関数でもあるのだから

言語としてCをわざわざ選択する必要が無いと言ってるだけだ
521デフォルトの名無しさん:2005/06/29(水) 20:17:08
>502の言う、「Cの標準関数を一通り」は>519の言う「主要ライブラリなんて、高々2、30程度」とは違う気がする。

つーか、スレ違いだってばよ。
522デフォルトの名無しさん:2005/06/29(水) 20:25:49
「XXではYYという便利な仕掛けがあるので、ダイレクトな理解の妨げになる。
 ZZなんてたいしたことはないので、一通り見ておけ云々」
この構文を使えば、PASCALのようなキッチェなプログラミング言語を使ってる香具師を
批難したり、DMAの直接入力でOSを放り込んだりすることを今更勧めたり、
プログラマは皆量子力学を披露するべき、みたいな文章が簡単に作成できます。
 キモは、何を指しているのかよくわからない、「ダイレクトな理解」。
523デフォルトの名無しさん:2005/06/29(水) 20:29:26
「プログラマは皆アセンブラをやるべきだ」という主張ならわからんでもない

「Cをやるべきだ」という主張は正直中途半端で疑問が残る
いまどきC++ではなくCでなければならない仕事って、そんなに多いか?
524デフォルトの名無しさん:2005/06/29(水) 20:36:52
>>492
遅レスだがほっとけない。

うぃんどうずというもののべんきょうから
はじめましょうね、いいこだから。
525デフォルトの名無しさん:2005/06/29(水) 20:37:23
だれもCじゃなきゃ出来ない仕事の話などしておらん。
526デフォルトの名無しさん:2005/06/29(水) 20:39:22
もうそろそろその宗教論争止めませんか?
言語の使い方が人それぞれ違うんだし、
理論的にどっちがいいなんて導ける筈無いんだから。
ついでに言えば、かなりスレ違いだし(その論争専門のスレなかったっけ)。
527デフォルトの名無しさん:2005/06/29(水) 21:24:06
すいません
printfで浮動小数の%fで右寄せにするにはどうすればいいのでしょうか・・・
%f3.2みたいにしたんですがうまくできません・・・

   3.00
  10.23
 100.00
    ↑
揃ってないけどここで揃えたい
528デフォルトの名無しさん:2005/06/29(水) 21:38:09
>>527
%3.2f の 3 の数字を、もっと充分な桁数にすればいいんじゃない?
とりあえず %6.2f はどうよ?
529デフォルトの名無しさん:2005/06/29(水) 21:41:04
>>528
できました!!
あなたは私の恩人です!ありがとうございます!
530デフォルトの名無しさん:2005/06/29(水) 22:36:48
キーボードから入力した任意のファイルを開く操作を以下のようにしたのですがcore dumpしてしまいます。
なぜでしょうか?お願いします。

void open_r(FILE *fp){
  
  char *str;
  
  gets(str);
  
  if((fp=fopen(str,"r"))==NULL){
    puts("E1");
    exit(1);
  }
}
531デフォルトの名無しさん:2005/06/29(水) 22:39:15
>>530
getsを使うな。
532デフォルトの名無しさん:2005/06/29(水) 22:43:01
>>530
strの領域確保して無いじゃん
533デフォルトの名無しさん:2005/06/29(水) 22:43:35
突っ込みどころ違(ry
534デフォルトの名無しさん:2005/06/29(水) 22:44:39
>>475
浮動小数点演算に必ず誤差があると思ってる奴はアホ。
535デフォルトの名無しさん:2005/06/29(水) 22:45:56
>>534
詳しく
536デフォルトの名無しさん:2005/06/29(水) 22:48:31
誰が必ず誤差があると書いてるのか
537530:2005/06/29(水) 22:48:57
>>531
gets以外を使うとしたらどのようにしたら良いのでしょうか?

>>532
ちょっとmallocつかってやってみます。
538デフォルトの名無しさん:2005/06/29(水) 22:56:53
fgetsをつかう。
539デフォルトの名無しさん:2005/06/29(水) 23:00:02
540デフォルトの名無しさん:2005/06/29(水) 23:09:20
malloc なんか使わんでも、
char str[256];
とかで十分だろ。
それ以前に、その関数open_rはどこから呼ばれるのか?
FILEポインタはちゃんと渡されているのか?
541530:2005/06/29(水) 23:15:56
>>538
fgetsの場合は

fgets(str,256,stdin);

のような形でいいのでしょうか?

>>540
なるほど。
関数open_rはmainから呼ばれて

int main(void){
  
  FILE *fp0,*fp1,*fp2,*fp3;
  printf("読み込むファイルを指定してください>>");

  open_r(fp0);
  open_r(fp1);
・・・

のようになってます。

とりあえずfgetsつかってみます。
542デフォルトの名無しさん:2005/06/29(水) 23:19:08
>>541
fgets(str, sizeof str, stdin);の方が配列の大きさを気にせず、機械的にこうすれば良いと覚えられるので楽。
543デフォルトの名無しさん:2005/06/29(水) 23:22:06
でたw
一番アホなやり方ww
バッファが溢れた場合誤動作してしまう最悪なコーディングwww
バカ丸出しwwww
544デフォルトの名無しさん:2005/06/29(水) 23:23:00
545530:2005/06/29(水) 23:25:16
>>541
ありがとうございます。プログラムの反応が明らかに違いました。
しかし入力ファイル名はa.txtなのですが、a.txtと入力したにも係わらずなぜか開けずE1と出力されます@@
ちなみに今のopen_rはこのようになっています。
void open_r(FILE *fp){
  
  char str[256];
  
  fgets(str,sizeof str,stdin);
  
  //ファイルが開けなかったらE1
  if((fp=fopen(str,"r"))==NULL){
    puts("E1");
    exit(1);
  }
}
当然a.txtは実行ファイルと同じディレクトリおいています。
546デフォルトの名無しさん:2005/06/29(水) 23:26:59
実行ファイルと同じディレクトリ==カレントディレクトリではないこともある。
547デフォルトの名無しさん:2005/06/29(水) 23:27:54
>>541
open_r()で開いたファイルポインタをmain()に返してそっちで読み書きしたいなら
FILE *open_r(void)
のようにして、戻り値として返却するか、
void open_r(FILE**)
のようにして、ポインタ渡しにしなければダメ

>>545
fgets()で読んだバッファのケツには改行文字\nがついてるから
それを切り捨てろ
548530:2005/06/29(水) 23:28:21
>>539,544
すいません、見落としてました@@;
っということは上の結果がE1にいってしまうのは、
\nが入っているからということですか?
549530:2005/06/29(水) 23:30:08
なんとか解決しそうです。
ありがとうございます!
550デフォルトの名無しさん:2005/06/29(水) 23:30:13
>>548
聞く前に試せボケ
551デフォルトの名無しさん:2005/06/29(水) 23:31:19
>534
確かに整数なら桁あふれしない限り正確に表現可能だな。悔い改める。
552デフォルトの名無しさん:2005/06/29(水) 23:33:55
>>551
悔い改めるな
553デフォルトの名無しさん:2005/06/30(木) 01:08:19
#include <stdio.h>

void main(){
char a[20];
char *table[10];
int i,l;

for(i=0; i<8; i++){
gets(a);
table[i] = a;}

for(i = 0; i<8; i++){
printf("%s\n", table[i]);}

}


554デフォルトの名無しさん:2005/06/30(木) 01:12:19

C:\Documents and Settings\Owner\My Documents\4>char.exe
ame //キーボード入力
ika
usi
ebi
oni
kame
kiri
kuri //キーボード入力終了
ame //出力
ika
usi
ebi
oni
kame
kiri
kuri


>>553で↑のように出力されて欲しいのですが
実際はkuriが8回でて終わってしまいます。
どうしたら意図した出力結果が得られるのでしょうか?
555デフォルトの名無しさん:2005/06/30(木) 01:15:31
>>554
入門書でも買ってきたほうがいいよ。
556デフォルトの名無しさん:2005/06/30(木) 01:22:04
char *table[10];
for(i=0; i<8; i++){
gets(a);
table[i] = a;}



char table[10][20];
for(i=0; i<8; i++)
gets(table[i]);
557デフォルトの名無しさん:2005/06/30(木) 01:28:19
>>555
スレタイ嫁

無意味なレスするくらいなら消えろ低学歴
558デフォルトの名無しさん:2005/06/30(木) 01:30:03
>>557
無意味なレスするくらいなら消えろ低学歴
559デフォルトの名無しさん:2005/06/30(木) 01:32:29
>>557
無意味とは思えないな
一番的確だろ
560デフォルトの名無しさん:2005/06/30(木) 01:36:39
>>558
オウム返ししかできないようじゃやはり低学歴か

561デフォルトの名無しさん:2005/06/30(木) 01:43:41
>>560
どうしたんだ?お前、大丈夫か?
学歴コンプレックス?なに真っ赤になってんの?
562デフォルトの名無しさん:2005/06/30(木) 01:50:04
>>561
お前邪魔だから消えていいよ低学歴君
ここにいても役に立たないしな
563デフォルトの名無しさん:2005/06/30(木) 01:52:21
>>562
プププ
564デフォルトの名無しさん:2005/06/30(木) 01:56:56
暇人だな専門生よ
565デフォルトの名無しさん:2005/06/30(木) 02:00:01
■■■荒らし注意報■■■
PC技術系板全般で粘着荒らしが猛威をふるっています。
正しくないことが明らかな意見を肯定し続ける、煽りに便乗して中身のないレスを連投するなど症状が見られますので、ご注意ください。
566デフォルトの名無しさん:2005/06/30(木) 02:00:02
おまえらいい加減にせよ
567デフォルトの名無しさん:2005/06/30(木) 02:04:10
質問に対して回答以外のレスをつけるやつが居るから荒れる原因になるんだよ。反省しろ。
568デフォルトの名無しさん:2005/06/30(木) 02:13:00
>>567
どれの事だ?
どう見てもスルーできない馬鹿が原因だな
わざとであろうけれど
569デフォルトの名無しさん:2005/06/30(木) 02:21:21
スルーしなければならないような屑カキコをするほうに問題があると思うが
570デフォルトの名無しさん:2005/06/30(木) 02:42:29
急速にスレの質が低下してまいりました
571デフォルトの名無しさん:2005/06/30(木) 02:45:01
スレの質、ってなんだ?
何が良なんだ?
572痔々ぃ:2005/06/30(木) 06:40:57
なぜ構造化代入ができると思ったのだろう?
最近のプログラマは費用とか考えないのだろうか・・・
573デフォルトの名無しさん:2005/06/30(木) 17:12:52
C言語で下のようなデータ列に
y = a*x^6 + b*x^5 + c*x^4 + d*x^3 + e*x^2 + f*x + g
という6次式に近似して、それぞれの係数a,b,c,d,e,f,gを表示するような
数値計算プログラムが組みたいのですが、曲線近似なんてしたことないので
どうしたらいいのか分かりません。教えてください。


xy
───────
21265
21366
21468
21568
21668
21768
21875
21992
220138
221202
222209
223211
224216
225219
226221
───────
574573:2005/06/30(木) 17:15:10
すいません、データにスペース入れていませんでした。

x y
───────
212  65
213  66
214  68
215  68
216  68
217  68
218  75
219  92
220  138
221  202
222  209
223  211
224  216
225  219
226  221
575デフォルトの名無しさん:2005/06/30(木) 17:53:38
>>573
そりゃCの問題ではないんでないかい?
576デフォルトの名無しさん:2005/06/30(木) 18:07:26
数学板向きかな。
3次なら兎も角、6次式ってかなり無理がある気がするけどね。
点数少ないし。
577デフォルトの名無しさん:2005/06/30(木) 18:33:23
可変個引数を取るマクロの定義はできますか?
やりたいのは、

MYMACRO(fmt, ...)



printf("%s(%d): " fmt, __FILE__, __LINE__, ...)

みたいに展開することです。

MYMACRO("%s の点数は %d点です", name, pts);

とやれば

printf("%s(%d): " "%s の点数は %d点です", __FILE__, __LINE__, name, pts);

というようにです。
なおこのマクロでは、展開の都合で fmt は文字列定数という制限が付くことになります。
578デフォルトの名無しさん:2005/06/30(木) 18:39:51
>>577
無理。
類似品として、MYMACRO((...))でいいのならなんとかなる。
#つまり、フォーマット文字列から先を全部纏めて置換するわけ屋根。
579577:2005/06/30(木) 18:45:13
>>578
やっぱり無理ですか。
ところでその代替案は、つまり

#define MYMACRO(arg) printf("%s(%d): ", __FILE__, __LINE__); printf(arg)

と定義して、

MYMACRO(("%s の点数は %d点です", name, pts));

みたいに使うということですか?
580577:2005/06/30(木) 18:48:40
定義が違うか。

#define MYMACRO(arg) printf("%s(%d): ", __FILE__, __LINE__); printf arg

ですね?

581デフォルトの名無しさん:2005/06/30(木) 19:19:52
main関数の中でscanfを使って角度を入力させ、独自の関数の中で入力された角度をラジアンに変換したい
んですが、どうすればいいんですか?
582デフォルトの名無しさん:2005/06/30(木) 19:45:09
>>581
その通りにすればいいのでは?
それぞれのステップで何をすればいいのか判らないなら初心者スレへ、
丸投げしたいなら宿題スレへどうぞ。
583デフォルトの名無しさん:2005/06/30(木) 21:02:52
printfの戻り値ってK&R見てたら「書き出された文字数」ってかいてあるけど
snprintfでは「書き出すのに必要な文字数」であって「実際に書き出された文字数」ではないのですか?
例:
r=snprintf(aBuff, 2, " %d", -987);
で結果は
r=5,aBuff={' ','\0',・・・}
になるのですが・・・
584デフォルトの名無しさん:2005/06/30(木) 21:11:25
>577
C99 なら OK。
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00053.html
すれ違いだが gcc などは独自にそういう機能を提供していた。
585デフォルトの名無しさん:2005/06/30(木) 22:05:43
>>583
渡したバッファ長より出力が長い場合は、バッファへの出力は打ち切られるけど戻り値は打ち切られなかったときの
サイズが返るんじゃない?
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/snprintf.3.html
>出力が切り詰められた場合には、もし十分なスペースがあれば書き込まれたであろう文字の個数 (文字列の終端にある '\0' を除く) を返す。
586デフォルトの名無しさん:2005/06/30(木) 22:50:22
XP上でVC++6.0で_beginthreadex
を使えないんです。原因分かる方ヘルプゥゥ!
もちろんprocess.hしてます。

・・・・・コンパイラメッセージ・・・・・・
warning C4013: 関数 '_beginthread' は定義されていません。
587デフォルトの名無しさん:2005/06/30(木) 23:14:00
>>586
スレ違い。
つーか、マルチすんな。
588デフォルトの名無しさん:2005/07/01(金) 00:02:36
二次元配列を動的に割り当てたくて、以下のようにしたのですが問題があります。

//p[3][4]っぽくしたい
int **p = (int **)malloc(sizeof(int *) * 3);
for(i = 0; i < 3; i++) p[i] = (int *)malloc(sizeof(int) * 4);

このようにしたのですが要素のアドレス的な連続性がないです。(p[0][3]の次がp[1][0]になってない。)
なので、

for(j = 0; j < 3; j++){
for(i = 0; i < 4; i++){
p[j][i] = i + (j*4);
printf("%d, \n", *((*p) + i + (j*4)));
}
}

のようにした場合に、p[j][i]に値は入るのですが、*((*p) + i + (j*4))では同じ位置を指してくれません。
p[j][i]も*((*p) + i + (j*4))も使えるように二次元配列を動的に割り当てることは出来るのでしょうか?
589デフォルトの名無しさん:2005/07/01(金) 00:06:41
>>588
int (*p)[4] = (int (*)[4])malloc(sizeof(int) * 3 * 4);
590デフォルトの名無しさん:2005/07/01(金) 00:07:29
Cならmallocのキャストはいらなくね?
591デフォルトの名無しさん:2005/07/01(金) 00:11:48
>>589
動的じゃなくね?
592デフォルトの名無しさん:2005/07/01(金) 00:14:00
int n = 4;
int (*p)[n] = (int (*)[n])malloc(sizeof(int) * 3 * n);
とかできないじゃん
593デフォルトの名無しさん:2005/07/01(金) 00:20:59
void **Alloc2(size_t x, size_t y, size_t size)
{
    void **p = malloc(sizeof (void *) * x);
    void *pY = malloc(size * x * y);
    size_t i;
    for (i = 0; i < x; i++)
        p[i] = pY + i * y;
}

void Free2(void **pp)
{
    free(*pp);
    free(pp);
}

こう使える。
int **p = (int **)Alloc2(3, 4, sizeof (int));
// >>588の後半
Free2((void **)p);
594デフォルトの名無しさん:2005/07/01(金) 00:21:30
結論。あきらめてただのint *pとアクセス関数またはマクロを使え
ってことかな?
595デフォルトの名無しさん:2005/07/01(金) 00:22:08
ったくうんこだなー
覚えたての配列へのポインタが使いたくて仕方がなかったんだよ >>589
596デフォルトの名無しさん:2005/07/01(金) 00:23:23
>>593
それ、二つの領域をつなげてallocするとfreeの手間がラクになりそうだが
alignさせるのがちょっと面倒か
597デフォルトの名無しさん:2005/07/01(金) 00:28:49
>>596
こうか?
size_t IndexSize = sizeof (void *) * x;
void **p = malloc(IndexSize + size * x * y);
void *pY = p + IndexSize;

ところでAlloc2()、return書き忘れた……。
○| ̄|_
598デフォルトの名無しさん:2005/07/01(金) 00:31:18
アホ草。一次元配列ガッポリとって自分で添え字管理すれば十分
599デフォルトの名無しさん:2005/07/01(金) 00:31:45
>>597
それだと、doubleの配列とかで問題になるだろ
600デフォルトの名無しさん:2005/07/01(金) 00:31:53
>>593
コンパイル通らないなぁ、なんでだろ?
601デフォルトの名無しさん:2005/07/01(金) 01:05:24
>>600
宣言前でmalloc呼んでるからじゃね?
602デフォルトの名無しさん:2005/07/01(金) 01:08:22
Alloc2がreturnしてないからとか?
603デフォルトの名無しさん:2005/07/01(金) 01:10:05
こういうの見ると、さっさとC++に移行しると
言いたくなるな
604デフォルトの名無しさん:2005/07/01(金) 01:15:29
> p[i] = pY + i * y;

error C2036: 'void *' : サイズが定義されていません。
605デフォルトの名無しさん:2005/07/01(金) 01:26:30
>>603
そうやって逃げてちゃウデは上がらないでしょ。
606デフォルトの名無しさん:2005/07/01(金) 01:33:04
>>605
こういうのは不要なウデだと思うんだがなあ
607デフォルトの名無しさん:2005/07/01(金) 01:34:18
スレ違い
608デフォルトの名無しさん:2005/07/01(金) 02:05:04
ひでぇ〜もんだな
609デフォルトの名無しさん:2005/07/01(金) 05:18:53
>>600 >>604
p[i] = (int *)pY + i * y;
とかにしなきゃ無理?
610デフォルトの名無しさん:2005/07/01(金) 05:34:36
変換指定というものの、
%09.9f の.9の部分は何をどう表してるんですか?
^^
もし変換指定子がdなら.9は省略してもおkですか?
自分が持ってる本には、「表示する最小の桁数を指定します。省略した場合は、整数の場合は1であるとみなされます」とあります。
教えてくださいorz
611610:2005/07/01(金) 06:47:54
^^の場所ずれてますねorz
すいません
612デフォルトの名無しさん:2005/07/01(金) 07:24:15 BE:56191924-
本の説明のとおり、小数点以下の表示桁数だよ。
たとえば数値が 12.34567 だとすると
%.9f なら 12.345670000 ってなるし
%.3f なら 12.346 ってなる。
小数点の左側は全体の表示桁数ね。
%09.3f なら 00012.346 ってなる。

%dなら小数点はいらない。っていうか普通付けない。
613610:2005/07/01(金) 14:13:28
>>612
よく分かりました!
ありがとうございましたm(__)m
614デフォルトの名無しさん:2005/07/01(金) 15:51:16
#include?<stdio.h>
#include?<math.h>

double?f(double?a,?double?p,?double?x)
{
??return?(exp(-x*x/(2.0*a*a))*cos(3.14*x+p));
}
int?main()?{
??double?a,?p,?x;?
 a=0.6;
p=0.0;

??for(x=-3.14;x?<=?3.14;x+=0.01)?{
????printf("%.2f , %f\n",?x,?f(a,?p,?x));
???}
??return?0;
}

gnuplotでこのプログラムのグラフを表示させたんですが、上手くいきません。
どこを直せばいいと思いますか?
615デフォルトの名無しさん:2005/07/01(金) 15:52:55
すいません?の部分は空白だと思ってください。
616デフォルトの名無しさん:2005/07/01(金) 16:06:10
#include?<stdio.h>
修正しました。

#include?<math.h>

double?f(double?a,double?p,double?x)?{
??return?(exp(-x*x/(2.0*a*a))*cos(3.14*x+p));
}
int?main()?{
??double?a,?p,?x;
??a=0.6;
p=0.0;
??for(x=-3.14;x?<=?3.14;x+=0.01)?{
????printf("%f , %f\n",?x,?f(a,?p,?x));
??}
??return?0;
}
617デフォルトの名無しさん:2005/07/01(金) 16:19:41
インデントは全角スペースか&nbsp;使え
618614〜616:2005/07/01(金) 16:20:33
あれ、また?が…何でだもうわかわからん。
すいません、僕の書き込みは無視してください。
お騒がせしてすいませんでした。
619デフォルトの名無しさん:2005/07/01(金) 17:29:26
>>618
gnuplotがダメならExcelで試してみるとか。
まぁ、いずれにしてもCの話じゃない罠。
620デフォルトの名無しさん:2005/07/01(金) 22:01:21
error C2181: else 文が if と一致しません。

これはどういう意味でしょうか?
621デフォルトの名無しさん:2005/07/01(金) 22:03:22
>>620
コードを見せろ。
622デフォルトの名無しさん:2005/07/01(金) 22:11:07
>>620
・括弧の対応が合ってない
・ifが無いのにelseがある
623デフォルトの名無しさん:2005/07/01(金) 22:13:06
>>620
そんなわかりやすいコンパイルエラーなんだから少しは分かれよ
コンパイラがかわいそうだ
624デフォルトの名無しさん:2005/07/01(金) 22:17:17
ヒント:日本人とは限らない。
625デフォルトの名無しさん:2005/07/01(金) 22:18:07
事故解決しました
626デフォルトの名無しさん:2005/07/01(金) 22:19:50
>>624
2chが読めるんならこの程度の日本語は読めるとおもわれ
627デフォルトの名無しさん:2005/07/01(金) 22:51:58
ごにょごにょと計算してその結果が
a[0]=3.14
a[1]=1.23
a[2]=2.34
・・・・
と配列に入っています(実数で)
これをテキストファイルに出力したいのですが本に載ってるやり方で出来ませんでした
intからdoubleうんちゃらかんちゃらとかよくわかんないです
整数データじゃないと出力できないんでしょうか?
628デフォルトの名無しさん:2005/07/01(金) 22:53:42
>>627
for (i = 0; i < N; ++i)
  printf("%f ", a[i]);

とかで出力できんのか
629627:2005/07/01(金) 22:54:40
画面には出来ます
ファイルに書き出したいんです
630デフォルトの名無しさん:2005/07/01(金) 22:55:13
hoge.exe > a.txt
でリダイレクトしろ。
631デフォルトの名無しさん:2005/07/01(金) 22:56:33
>>629
リダイレクトでもいいし
fp = fopen("out.txt","w");
としたあとで
printf(...)のかわりにfprintf(fp,...)を使えばよい
632デフォルトの名無しさん:2005/07/01(金) 22:57:33
freopen("FileName", "w", stdout) もしくはリダイレクト もしくは fprintf。
633627:2005/07/01(金) 23:09:36
fprintfを使ったらとりあえずできました
本にはfputsが載っていてそれだとエラーでした
リダイレクトは知っているのですが、そのほかにも大量に色々計算していて
最終的に結果のみを出力したかったので質問しました
(リダイレクトしてテキスト開いて結果だけコピーして・・・というの面倒なので)

またエラーでたら来ます
634デフォルトの名無しさん:2005/07/01(金) 23:27:15
>>633
エラー出たら来るじゃなくて、考えてわからなかったら来いや…
635デフォルトの名無しさん:2005/07/01(金) 23:30:56
線形論理の古典論理のLKの推論の∨(または)右

Γ→凵AC/Γ→凵AC∨D

および

Γ→凵AD/Γ→凵AC∨D

となるプログラムをCで表してほしいです。
636デフォルトの名無しさん:2005/07/01(金) 23:33:53
マルチポストいくない
637588:2005/07/01(金) 23:45:46
遅くなりましたが、なんとなく分かりました。ありがとうございました
638前スレ392:2005/07/02(土) 08:05:50
>>前スレ394
どうもありがとうございました。m(_ _)m
639デフォルトの名無しさん:2005/07/02(土) 10:21:07
だれかダイテル本の解答を教えてくれ。
この本で勉強したヤツらはみんな、
正解なのか不正解なのか分からないまま
ムンムンとした欲求不満状態で読み進めていったのか?
640デフォルトの名無しさん:2005/07/02(土) 10:35:56
最初から正解がちゃんとある本を買えばええ。
641デフォルトの名無しさん:2005/07/02(土) 10:45:48
質問です。

多次元配列 int* a[51][10]
をある関数に引数として渡したいのですが、

func(int[][] a)としたらコンパイルエラーとなりました。

どうすればいいのでしょうか?

よろしくお願いします。
642641:2005/07/02(土) 10:49:03
プロトタイプ宣言として void func(int[][] a)としたらコンパイルエラーとなりました。
643641:2005/07/02(土) 10:57:12
func(int** a)で対応できました。

ポインタのポインタですね。

失礼しました。
644デフォルトの名無しさん:2005/07/02(土) 11:02:05
何方かフリーのCコンパイラ(登録なし)知りませんか??
645デフォルトの名無しさん:2005/07/02(土) 11:14:13
>>644
VC Toolkit, gcc, LSI Cなどいろいろある。
646テンプレ抜けてたね・・・:2005/07/02(土) 11:14:35
>>644
【コンパイラ】 
gcc 
http://gcc.gnu.org/ 

【Win32用の開発環境のみ。】 
gcc-cygwin 
http://www.cygwin.com/ 
gcc-mingw 
http://www.mingw.org 
Digital Mars C++ 
http://www.digitalmars.com/ 
Open Watcom 
http://www.openwatcom.com/ 
Borland C++ Compiler 5.5.1 
http://www.borland.co.jp/cppbuilder/freecompiler/ 
Visual C++ Developer Center: Microsoft Visual C++ Toolkit 2003 
http://msdn.microsoft.com/visualc/vctoolkit2003/ 

【ライセンスや機能などに問題あり】 
Microsoft C/C++ 13.0.9466(VC.NET) 
http://www.microsoft.com/japan/msdn/netframework/downloads/ 
LCC-Win32 
http://www.cs.virginia.edu/~lcc-win32/ 
CINT 
http://root.cern.ch/root/Cint.html 
めじろ++98 
http://www.vector.co.jp/soft/win95/prog/se075910.html 
Intel C++ Compiler for Linux 
http://developer.intel.com/software/products/compilers/clin/noncom.htm 
647デフォルトの名無しさん:2005/07/02(土) 11:28:12
>>643
それだと a[y][x] みたいな使い方をしたときに、おそらく期待した動作をしないよ。
>>276 >>279 >>281 ・・・ >>288 ・・・ あたりの一連は参考になるかな。
とどのつまり、func(int (*a)[10]) と定義して a[y][x] と使うか、
func(int (*a)[51][10]) と定義して (*a)[y][x] として使うかのどっちかかな。
意味的な違いで使い分ければいいと思う(int[10] の行の集合を指し示すポインタなのか、int[51][10] の二次元の塊を指し示す
ポインタなのかってこと)。
a++ ってやったときに、前者の定義だと y が一つ進んだポインタになるし、後者の定義だと次の int[51][10] のメモリブロックを
指すポインタになる。
648デフォルトの名無しさん:2005/07/02(土) 11:32:51
func(int (*a)[10])だとこれを呼ぶときにはfunc(a);となる。
func(int (*a)[51][10])だと、func(&a);としなければならない。
649デフォルトの名無しさん:2005/07/02(土) 11:34:17
ちなみにint a[4][51][10];と宣言した変数 a なら後者のfuncへfunc(a);と呼べる。
650デフォルトの名無しさん:2005/07/02(土) 11:46:33
>>648
だからそれが意味的な違いって言うことだよ。
int[51][10] の領域を一つの実体としたデータ構造なら、&a とやって渡すのが妥当だじゃないか?
実際構造体もそうなわけだし。
typedef int BOKE[51][10]
と定義したタイプがあったとすれば、その実体は
BOKE x;
だし、それを受け取る関数は
func(BOKE *a)
だし、それにポインタを渡すなら func(&x) でしょ。
二次元配列丸ごと全部で一つのデータ構造なのであれば二次元配列を指し示すポインタとして、一次元配列の
集合というデータ構造ならば一次元配列を指し示すポインタとして定義するべきだと思う。
たとえばコンソール画面の内容を二次元配列に入れてたとして、その画面を何画面も持ちたいときなんかを
考えれば、a++ とやったときにポインタが一行進むべきなのか一画面進むべきなのか、どちらが妥当か?
という問題だと思う。
651650:2005/07/02(土) 11:49:12
あ、>>648 を否定してるとかそういうことじゃないよ。
データ構造の表し方についてコメントしたかっただけ。
652デフォルトの名無しさん:2005/07/02(土) 15:34:52
(アプリ)[学習] C言語の初歩missionC(美少女と一緒にゲーム感覚で覚えられます)(ccd).rar e5Vh8m7eY0 238,635,666 51d68b5eaf5514b488f03bda66c98a63
653デフォルトの名無しさん:2005/07/02(土) 15:48:46
missionCとmissionJの違いにワラタ
654デフォルトの名無しさん:2005/07/02(土) 17:24:30
C言語を始めて学習したいと思い、ヨドバシに何かソフトを買おうと
行ってきたのですが、C#とかC++とかあって何を買う方がいいのか
迷いました。
この2つの違いとボーランドとマイクロソフトはどちらを買えばいいのか
ご教授ください。
655デフォルトの名無しさん:2005/07/02(土) 17:26:33
>>654
悲しくなるほどスレ違い。それらはどちらも「C」ではない。
656デフォルトの名無しさん:2005/07/02(土) 17:40:55
マイクロソフトっていくらで買えるの?
657デフォルトの名無しさん:2005/07/02(土) 17:48:53
>>654
C++コンパイラは普通Cもコンパイルできる
C#コンパイラは普通Cはコンパイルできない

CをやりたいんならC++用の開発環境を探しなさい
658デフォルトの名無しさん:2005/07/02(土) 18:34:19
学生ならMSのVisual Studio the Spokeがただのアカデミック版より安く買える。
659デフォルトの名無しさん:2005/07/02(土) 18:51:52
>>657
ご丁寧なお返事ありがとうございます。

CとC++とC#の違いを教えて下さい。
660デフォルトの名無しさん:2005/07/02(土) 18:58:18
C 昔Unixを高級言語で書きたいということで作られたというだけあって高級言語の中では低級言語に近い。
C++ 元はCへSimulaのオブジェクト指向を加えたい、ということから始まった。
 Cユーザを引き連れたいということで、Cのソースは基本的にそのままC++でも使える。
661デフォルトの名無しさん:2005/07/02(土) 19:02:59
>>659
C言語やりたいだけなら、製品買わなくても、>>646 で十分
662デフォルトの名無しさん:2005/07/02(土) 19:03:34
C言語を勉強しているのですが
exit();
するときに、
exit(1);
ではなく、stdlibの"EXIT_FAILURE"を使い
exit(EXIT_FAILURE);
としたほうが、汎用的になる
とあるのですが、意味が書いてありません
検索してみても、意味の記述はありませんでした
どのような意味で、どのような利点があるのでしょうか?
663デフォルトの名無しさん:2005/07/02(土) 19:05:03
>>659
C++はCのスーパーセット(上位互換)と思っていれば大体間違いはない。
つまり根っこは同じで、Cに色々と仕様を追加して拡張された言語だ。
だから、C++用の開発環境は通常Cも扱えるし、扱う。

C#は構文的にC系統の言語を受け継いではいるものの、全く別物の言語。

664デフォルトの名無しさん:2005/07/02(土) 19:07:06
>>662
俺的には利点は全く無いな。

exitに渡したいのは0/1だけじゃないし、
EXIT_SUCCESSやEXIT_FAILUREは規格で0/1と定められているから、
何かを隠蔽しているわけでも環境によって値が変わるわけでもない。
665デフォルトの名無しさん:2005/07/02(土) 19:10:19
関数内で作った変数を、違う関数内で使いたい場合はどのようにするのでしょうか?
グローバル変数を使おうと思ったのですが数が多いので
グローバル変数を使わずにできる方法等あれば教えてほしいです
どうかよろしくお願いします
666デフォルトの名無しさん:2005/07/02(土) 19:11:48
>>661
ありがとうございます。

タダで使えるBorland C++ Part4
http://pc8.2ch.net/test/read.cgi/tech/1091066805/

これを今DLしました。
良かった、今日ヨドバシで買わなくて良かった。

>>663
なるほど、それじゃC++にしておけばCも含んでいるんですね。

「Borland C++ Compiler 5.5 無償ダウンロード」と製品版の違いは
何なんでしょうか?
667デフォルトの名無しさん:2005/07/02(土) 19:13:49
>>665
構造体でも使ったらどうだ。
struct param { int a, char *b, ... };

void set(struct param *p) { p->a = 1; p->b = "hello"; }
void get(struct param *p) { printf("%d %s\n", p->a, p->b); }

とかそんなかんじだ。
668デフォルトの名無しさん:2005/07/02(土) 19:29:44
>>666
製品版てのは C++ Builder とかじゃない?
これは、Windowsアプリ開発のためのGUIエディタとか、
デバッガとかが入った統合環境。
って、これはもうスレ違いな質問
669デフォルトの名無しさん:2005/07/02(土) 19:56:42
>>668
本当にありがとうございました。
向こうのスレで聞いてみます。

Cのこと何も知らない癖に出来ますって言って
就職活動してるんです。
670デフォルトの名無しさん:2005/07/02(土) 19:59:03
>>669
おまえの人生そこで終わりだ
マをなめるな
671デフォルトの名無しさん:2005/07/02(土) 19:59:44
>>669
そうか
がんばれよ!




で、デスマ要員になってさっさと死ね
672デフォルトの名無しさん:2005/07/02(土) 20:05:03
見栄をはる奴にはコード書くのはむずいと思うのは俺だけか?
673665:2005/07/02(土) 20:08:45
>>668
ありがとうございます
すいませんが、構造体は少し調べてみたのですが
よくわかりません
他には方法はないでしょうか?
674デフォルトの名無しさん:2005/07/02(土) 20:36:53
>>673
Cの標準的な関数の使い方を一通り眺めれば、どんな風にするとうまくいきそうかわかるんじゃないかい?
たとえば strcpy なんかは、内部で文字列のコピーを作って、呼び出し元の変数に値を返してるとも考えられる。
localtime なんかは、内部で展開した各種値を構造体に返すようにできてる。
ようは、呼出元に値の返却先を用意して、関数はその領域に対して値を格納するように作るのが一般的。
675665:2005/07/02(土) 20:39:33
調べてみてもわからないのですが
->の矢印は.と同位なんですかね?

それと、他にも質問があるのですが
struct param { int a, char *b, ... };
の場合
param *pは最初にmain関数で宣言するのですよね?
そしたら、
void hoge(struct param *p)とすることでどこからでも呼び出せるということでしょうか?
この場合、hogeを呼び出すにはmain関数内で
hoge(*p);
とするのでしょうか?

始めたばかりでよくわからないのですが教えていただけると幸いです
676デフォルトの名無しさん:2005/07/02(土) 20:41:47
>>673
構造体なんて、使ってみればそう難しくないさ。

typedef struct {
 int add;
 int sub;
 int mul;
 int div;
} ANSWER;

void calc(int a, int b, ANSWER *pans)
{
 pans->add = a + b;
 pans->sub = a - b;
 pans->mul = a * b;
 pans->div = a / b;
}

int main()
{
 ANSWER ans;
 calc(1000, 100, &ans);
 printf("1000 + 100 = %d\n", ans.add);
 printf("1000 - 100 = %d\n", ans.sub);
 printf("1000 * 100 = %d\n", ans.mul);
 printf("1000 / 100 = %d\n", ans.div);
 return 0;
}
677デフォルトの名無しさん:2005/07/02(土) 20:44:51
>>675
->と . は順位が同じというだけでもちろん意味は違う。
678デフォルトの名無しさん:2005/07/02(土) 20:46:59
>>675
struct は、typedef して使うと扱いやすいよ。
>>676 のサンプルを参照。
こうしておくと、ANSWER っていう型でコードを記述できるから、ラクチン。

-> は、その左側が構造体へのポインタの場合に使う。
p->x は (*p).x と同じ。
>>676 では、関数 func は ANSWER をポインタで扱ってるから、それに対してアクセスするのに -> を使ってる。
main では、ANSWER の実体を扱ってるから、それに対してアクセスするのに . を使ってる。
679デフォルトの名無しさん:2005/07/02(土) 20:47:45
さてお前等
. と -> の違いをどう説明するか
680678:2005/07/02(土) 20:48:01
× 関数 func
○ 関数 calc
681665:2005/07/02(土) 20:51:29
ありがとうございました!!
よくわかりました!!

682デフォルトの名無しさん:2005/07/02(土) 20:51:41
>>652 それいいな
683デフォルトの名無しさん:2005/07/02(土) 20:52:14
こいつなかなか筋がいいと思わないか?
684デフォルトの名無しさん:2005/07/02(土) 21:03:44
typedefとかstructって、変数初期化されるんだっけ?
なんか、考えてみるとそうだった気がしてきた

いま書いてるコード自分で初期化してるや
685デフォルトの名無しさん:2005/07/02(土) 21:06:21
>>684
されません。
686デフォルトの名無しさん:2005/07/02(土) 21:06:55
>>684
どんな型でも初期化子が存在すればそれで初期化される。
そうでない場合、グローバル・staticなら0で初期化され、自動変数なら初期化されない。
687デフォルトの名無しさん:2005/07/02(土) 21:09:28
>>686
グローバル・static なら 0 で初期化されるって、保証されてるの?
688684:2005/07/02(土) 21:13:53
ごめん
staticだったか
年はとりたくないもんだね

じゃあ、>>676はまずくないか?
689デフォルトの名無しさん:2005/07/02(土) 21:16:00
int a=0;
見たいな感じで初期化したいのですが
0以外で初期化するには何がありますか?

int a=NULL;
とかでも、初期化されてるんですか?
690デフォルトの名無しさん:2005/07/02(土) 21:16:02
>>688
ans は calc の結果返却先だから、初期化されてる必要は無いでしょ。
691デフォルトの名無しさん:2005/07/02(土) 21:18:37
>>689
int a=3;
692689:2005/07/02(土) 21:22:49
ごめんなさい
初期化と言う言葉はてきとうじゃなかったですね
0とかnullにしたいです
693デフォルトの名無しさん:2005/07/02(土) 21:26:15
int a=0;
の何が不満なのか。
694689:2005/07/02(土) 21:27:18
0とすると、0をセットしたみたいに思うので
nullとかでできるならそっちのほうがいいと思いまして
695デフォルトの名無しさん:2005/07/02(土) 21:28:05
ライブラリを作ります。
そのライブラリは、使用に先立って初期化処理をしておく必要があります。
普通このような初期化処理は、ライブラリを使うプログラムが明示的に呼び出すものだと思います。
しかしそうではなく、リンクしただけで実行の際に自動的に初期化処理が走るようにすることはできないでしょうか。
また同様に、プログラム終了時の後始末処理を自動で行うようにはできないでしょうか。
(これは、初期化処理が自動で走りさえすれば、そこで atexit ハンドラを登録することで何とかできそうですが)

ところで libc なんかは、内部的な初期化処理というのは行っていないのでしょうか?
696デフォルトの名無しさん:2005/07/02(土) 21:32:29
環境依存なんだな
697デフォルトの名無しさん:2005/07/02(土) 21:33:39
>>694
#define INIT_VALUE 0
a = INIT_VALUE;
とでもすればいい。

慣習的に、NULLはポインタに対して使われるものなので、
整数に対して使うのはお勧めできない。
698デフォルトの名無しさん:2005/07/02(土) 21:33:48
方法はあるだろうけど、環境依存になるだろうな。
699デフォルトの名無しさん:2005/07/02(土) 21:35:19
>>697
そんなのもお勧めできないだろ。
a = 0に慣れる以外に道はない。
700デフォルトの名無しさん:2005/07/02(土) 21:47:53
>>695
libcの内部的な初期化というのは大抵行われていると思っていいがその段階で何らかの関数を呼び出させるというのは無理。
C++が使えるのなら非公開のクラスを作って、そのコンストラクタで1通りの初期化をし、その型のグローバル変数をを無名名前空間に置くなんて技が使えるけど。
701デフォルトの名無しさん:2005/07/02(土) 22:08:49
初期化済みフラグでも用意して初期化し忘れで他の関数呼んだときに
エラー出して自衛するしかないな。
702デフォルトの名無しさん:2005/07/02(土) 22:12:13
>>695
ライブラリロード・アンロードのラッパ関数作って、
そこで初期化関数呼び出せばいいんじゃない?
ELFならinitとfinitをexportすればいいだろうけど。
703デフォルトの名無しさん:2005/07/02(土) 22:13:57
Win32ならDllmain()だな
まあ何にせよ環境依存だ
704デフォルトの名無しさん:2005/07/02(土) 23:13:31
コマンドラインアプリケーションで
int main(int argc, const char **argv){
として、引数を取得しているのですが
その引数の評価をoptionという関数でやろうと思い
int option(int argc, char **argv){
として、うけとり評価をしようと思っているのですが

optionを呼び出す際になんと呼び出せばいいのでしょうか?
option(argc, argv);だと
warning: passing arg 2 of `option' from incompatible pointer type
と、いわれます
ポインタと言うのがよくわからないのですが
この場合ワーニングを出さないにはどのように書けばいいのでしょうか?
705デフォルトの名無しさん:2005/07/02(土) 23:16:11
>>704
int main(int argc, const char **argv)
→int main(int argc, char **argv)
706695:2005/07/02(土) 23:18:04
一般的な方法は無いってことですね。
いろいろなアドバイスありがとうございました。
707デフォルトの名無しさん:2005/07/02(土) 23:19:28
>>705
むしろ option の方に const を付けるのがいいんじゃないか?
708704:2005/07/02(土) 23:21:09
すいません
constしてるのにconstしてない変数に代入してっぞって意味でしたか
709デフォルトの名無しさん:2005/07/02(土) 23:26:39
>>707
どっちでもいい。argvはconstである必要はないし、そうであってもいいから。
710デフォルトの名無しさん:2005/07/02(土) 23:41:50
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/649.txt
こういうプログラムを作ったのですが、入力のところがうまくいきません。
名前を入力しようとすると、名前の入力が飛ばされて、住所の入力に行ってしまいます。
原因は\nかなにかが入力されていることになってしまっていると思うんですが、
解決方法が分かりません。
解決方法をよろしくお願いします。
711デフォルトの名無しさん:2005/07/02(土) 23:47:51
最初のscanfで\nが残るんだろ。
空のfgets発行するか、scanfに\n追加するか、rewind(stdin)しとけ。
712デフォルトの名無しさん:2005/07/02(土) 23:49:37
>>710
http://www.kouno.jp/home/c_faq/c12.html#18
たぶん"%d%*[^\n]%*c"とでもすれば良かったと思う。

あとgets禁止。
http://www.kouno.jp/home/c_faq/c12.html#23
713デフォルトの名無しさん:2005/07/02(土) 23:52:02
ひどいコードだな
マジックナンバーを使うなとは欲いうが
まったくもって意味がわかってないと見えるな
714710:2005/07/03(日) 00:09:51
711,712
ありがとうございます。出来ました。
学校の課題で、scanfとgetsしか基本的に使っていないので、
getsを使用せざるを得ないので...
713
それは自分に対するレスですか?
マジックナンバーは最初から課題で指定されているので。
715デフォルトの名無しさん:2005/07/03(日) 00:12:09
>>714
MとかNじゃ、マジックナンバーを避けたことになっていない。
適切な名前を与えることによって初めてマジックナンバーを避けたことになる。
716デフォルトの名無しさん:2005/07/03(日) 00:13:41
>scanfとgetsしか基本的に使っていないので、
>getsを使用せざるを得ないので...

習ったものしか使えない?チミは高校生かね?
宿題ならスレ違いだし。
717710:2005/07/03(日) 00:52:56
>>715
MとかNは最初からそうするように指定されているので。

>>716
そういう意味じゃないですが、説明するのが面倒なので省略します。

まあ、とにかく、ありがとうございました。
718デフォルトの名無しさん:2005/07/03(日) 00:57:42
このスレ関係ないところに突っ込みすぎ
719デフォルトの名無しさん:2005/07/03(日) 01:20:11
>>709
どっちでもいいってか、option がどういう関数か、ってことだろ?
option が渡されたポインタが指す領域を書き換えないなら const を付けるべきだと思うが、いかがか?
720デフォルトの名無しさん:2005/07/03(日) 01:22:24
話がずれとる
721デフォルトの名無しさん:2005/07/03(日) 01:51:25
>>719
両方の選択枝を提示してあとはご勝手にって言うのが筋だと思う。
722719:2005/07/03(日) 02:24:50
>>721
コンパイルが通すことが目的ならそれでいいんだろうけど、
せっかくキーワードを付ける付けないが絡んで出てる問題なんだから、おれは正確な定義をするためのアドバイスをしたいな。
main の argv は慣例に則って const は付けなかったとしても、option の引数にはぜひとも const を付けていただきたいところ。

つーか、入力のみの変数なのに const を付けないプログラマが多くて、一緒に仕事すると萎えるって現状があるから
余計そう思ってるだけかもしれないけど。
723デフォルトの名無しさん:2005/07/03(日) 02:35:00
const char const * const * const argv
724デフォルトの名無しさん:2005/07/03(日) 02:49:43
const付けるかどうかは、optionの仕様による。
725デフォルトの名無しさん:2005/07/03(日) 02:55:39
たとえばgetopt(3)の宣言は
int getopt(int argc, char * const *argv, const char *optstring)
だったりするんだよな
(**argvは書き換えないが*argvは書き換える)

>>704はconstをよく理解していないようだし、自分で全部説明して
面倒見る気なら構わないが、そうでなければ悪戯に混乱させるだけじゃ
なかろうか。
726デフォルトの名無しさん:2005/07/03(日) 02:55:41
>const char const
const が二個着いてるがこれ大丈夫なの?
727デフォルトの名無しさん:2005/07/03(日) 02:58:51
ワニングが出るだろうな。
728デフォルトの名無しさん:2005/07/03(日) 03:01:57
>>727
VCが甘いだけで、実際には規格外じゃなかった?
729デフォルトの名無しさん:2005/07/03(日) 03:03:31
>>725
説明したけりゃ回りに突っかからずに704に説明すればいいだけの話では。密度の薄いスレだなー
730デフォルトの名無しさん:2005/07/03(日) 03:07:32
gcc -Wall -ansi でも一応コンパイルは通った。
731デフォルトの名無しさん:2005/07/03(日) 03:07:42
しかも>>725自身がconstを理解してない
732デフォルトの名無しさん:2005/07/03(日) 03:09:17
つか、意味もなくconst付けられても困る。
733デフォルトの名無しさん:2005/07/03(日) 03:13:47
>>729
俺は「説明したい」ワケじゃないし、別に周りに突っかかってない。

「constにこだわりたい」といってるのは>>719

734719:2005/07/03(日) 03:19:46
あれ、おれが周りに突っかかってると言われてるのかな?
option の定義についての一つの話題として意見を書いたつもりだったんだけど、おかしなこと言ってた?
735>>709,721:2005/07/03(日) 03:21:56
ま、もうどうでもいいじゃん、あとは質問者が好きなようにすれば。
はい次次!
736デフォルトの名無しさん:2005/07/03(日) 03:22:08
密度が急激に低下
             し
               て
                 い

                  ま

                  す
737デフォルトの名無しさん:2005/07/03(日) 03:22:34
const このスレの話題
738デフォルトの名無しさん:2005/07/03(日) 03:24:23
mainがその他の場所で書き換えるかもしれない。
739デフォルトの名無しさん:2005/07/03(日) 03:25:20
>>738
main の定義の話ではないのでは?
740デフォルトの名無しさん:2005/07/03(日) 03:26:23
mainの引数を他の関数に渡すときの話でしょ。
741デフォルトの名無しさん:2005/07/03(日) 03:29:32
mainがその他の関数に渡した引数を書き換えるかどうかは、その他の関数の知ったこっちゃないだろ。
742デフォルトの名無しさん:2005/07/03(日) 03:30:13
>>741
意味が全然わかってないひと
743デフォルトの名無しさん:2005/07/03(日) 03:32:13
>>742
その他の関数の引数にconstを付けるかどうかの話じゃないんだっけ
勘違いしてたらスマソ
744デフォルトの名無しさん:2005/07/03(日) 03:36:49
>>743
関数Aがポインタ引数の参照先を書き換えないのであれば、
そのポインタ引数はconst修飾すべきである

という、一貫してそれだけの話をしている。main()は関係ない。
745デフォルトの名無しさん:2005/07/03(日) 03:36:52
(・ω・´) つ 今日のボクの日記

const char * const * const a = NULL;
char * const * const b = NULL;
const char ** const c = NULL;
a = NULL; // NG
*a = NULL; // NG
**a = NULL; // NG
**b = NULL; // OK
*b = NULL; // NG
b = NULL; // NG
**c = NULL; // NG
*c = NULL; // OK
c = NULL; // NG

const って不思議だな・
746デフォルトの名無しさん:2005/07/03(日) 03:42:15
>>745
char に NULL を代入するのはいかがかと
747デフォルトの名無しさん:2005/07/03(日) 03:42:50
さぁ、次はNULLの話題だよ!
748デフォルトの名無しさん:2005/07/03(日) 03:48:06
>>744
それは元の質問から派生した、どちらかというとどうでもいい内容じゃないかな?
749デフォルトの名無しさん:2005/07/03(日) 03:49:29
>>747
よしキタ!
NULLより 0 の方がいい
http://homepage3.nifty.com/~masumoto/cpp/topic/#RSEC3
750デフォルトの名無しさん:2005/07/03(日) 03:56:54
main() {
return 333;
}
メインの戻り値は、どうせ使われていないので、何でも良いと
とあるお方に聞いたのですが、これは正しいのでしょうか?
「シェルを使う時は気にする必要がある」とよく見かけますが、
シェルがどーのとか言うのは良く解らないので、知識に溢れる方
の意見を伺いたいです。
751デフォルトの名無しさん:2005/07/03(日) 04:00:11
>>749
NULLが0じゃない処理系があるなんて、すっかり忘れてた。
ポインタを if(p) { ・・・} なんて評価しちゃうこと、よくあるな・・・
気をつけよう。
752デフォルトの名無しさん:2005/07/03(日) 04:02:33
5.3:
ポインターがヌルポインターでないかどうかのテストの省略形 「if(p)」は有効なのか? ヌルポインターの内部表現が0でない場合は どうなるのか。
753デフォルトの名無しさん:2005/07/03(日) 04:03:12

          ,、‐ ''"  ̄ ``'' ‐- 、
        /イハ/レ:::/V\∧ド\
       /::^'´::::::::::::i、::::::::::::::::::::::::::::\
     ‐'7::::::::::::::::::::::::ハ:ハ::|ヽ:::;、::::::::::::丶
     /::::::::::::::/!i::/|/  ! ヾ リハ:|;!、:::::::l
    /´7::::::::::〃|!/_,,、   ''"゛_^`''`‐ly:::ト     
      /|;ィ:::::N,、‐'゛_,,.\   ´''""'ヽ  !;Kいいかげん殺すよ
        ! |ハト〈  ,r''"゛  ,       リイ)|  この種の話題は聞き飽きてる   
          `y't     ヽ'         //
         ! ぃ、     、;:==ヲ   〃       
         `'' へ、   ` ‐ '゜   .イ
              `i;、     / l         
                〉 ` ‐ ´   l`ヽ
            / !        レ' ヽ_
754デフォルトの名無しさん:2005/07/03(日) 04:08:16
>>751
それは問題が無いことが保証されているはずだ

定数ゼロをポインタに代入する場合は、常にヌルポインターとして扱われるし
ポインタとゼロが比較される場合には、ヌルポインターかどうかの比較になる

ヌルポインタの実値がゼロでない処理系であれば
if ((long)p)
とでも書けば、まあ違いが出るだろう
755デフォルトの名無しさん:2005/07/03(日) 04:20:07
>>750
シェルってのは、ユーザーの指示により実行ファイルを起動したりするプログラムのこと。
DOSプロンプトなんかはユーザーが入力したコマンドによって実行ファイルを起動するし、Windowsのエクスプローラは
実行ファイルがダブルクリックされることによってそれを起動する。
で、実行されたプログラムは、シェルに対して数値を返すことができる。
処理が正しく実行され、正常に終了した場合なんかは、0 を返すようにしておくのが一般的。
なんらかのエラーが発生したときには、適当な番号を割り振って、それを返すようにしたりする。

シェルは、複数のコマンドをまとめて実行させる仕組みを持っていたりして、MS-DOSのシェルならバッチコマンド、
UNIXのシェルならシェルスクリプトなんて呼ばれる仕組みがそれ。
複数のコマンドを実行する都合、どれか一つのコマンドがエラーで終了したときなどには、以降の処理をキャンセル
したりなど、処理の流れを変えたかったりする。
そういうニーズに対応するため、コマンドはシェルに対して終了コードを返し、シェルはその値によって処理の
流れを変えられる仕組みを持っている。

だから、あんまりそういう使い方を意識していないならば、とりあえず0でも返しておくのがいいと思う。
返せる値の範囲は処理系によるけど、0〜255くらいにしておけばあんまり問題は起きないと思う。

ちなみに、コマンドはシェルから起動される以外に、別の実行ファイルから実行されることもある。
その実行元のプログラムは、実行したファイルの終了コードを取得することができるよ。

あんまりシンプルに書けなかったけど、わかったかしら?
756デフォルトの名無しさん:2005/07/03(日) 04:24:25
>>755
なげーよ。

ちなみにUNIXシェルの場合、127を超える戻り値を使うのは薦められない。
まあ、0〜3程度の小さな整数を使うのが普通だな。
757デフォルトの名無しさん:2005/07/03(日) 04:28:37
>>755
goo job. カンポキだ ちくしょう
// 意外にも貴重なレスが貰えてしまった (・ω・´) ありがとございます
758デフォルトの名無しさん:2005/07/03(日) 04:34:39
>>754
便乗質問させてください。
もし NULL = 0x100 の処理系があったとします。
p = 0;
とやると、p に 0x100 が代入されるということでしょうか?
そして、p = 1 のときに p-- とやってしまうと、p はいくつになるのでしょうか?
関連して、p = 1 のときに
p2 = --p;
とやったときの、それぞれのポインタの値も気になります。
759デフォルトの名無しさん:2005/07/03(日) 04:35:53
この流れでなんでそんなことすら分かんねーんだよ…
760デフォルトの名無しさん:2005/07/03(日) 05:08:29
>>758
> p = 0;
→ (long)p == 0x100

> p = 1 のときに p-- とやって
→ (long)p == 0x0 (pがchar*のとき)

> p = 1 のときにp2 = --p;とやったとき
→ (long)p == 0x0
  (long)p2 == 0x0

じゃないかな、多分
761デフォルトの名無しさん:2005/07/03(日) 05:08:45
なんで>>1すら読まないで便乗質問するんだろうか
762758:2005/07/03(日) 05:38:44
>>760
質問しておいてアレですが、それで正しいと思います。
>>761
すまん。faqを読めばしっかり書いてあったね。
ようするに、ポインタに絡む定数0は、コンパイラがヌルポインタに置き換えるんだね。
コンパイル後に結果的にポインタに値0が代入されたり比較されることになっても、コンパイル時にコンパイラがしたような
変換はされないということだ。
だから >>758 の p-- の結果は 0 になるし、0 になったときに 0x100 に置き換えるようなコードが挿入されるわけでも
ないわけだ。
あと、NULL の define が 0x100 になってると思ってたことが間違いだってことにも気付いた。
763デフォルトの名無しさん:2005/07/03(日) 10:15:43
なんで
exit(1);
は、エラー時に使うのに

return 1;
は通常終わりに返すんですか?

return 0;
はエラーなんですか?
764デフォルトの名無しさん:2005/07/03(日) 10:20:21
> exit(1);
> は、エラー時に使うのに
そんなことは決っていない。

> return 1;
> は通常終わりに返すんですか?
そんなことは決っていない。

> return 0;
> はエラーなんですか?
エラーの場合もある。
765デフォルトの名無しさん:2005/07/03(日) 10:24:13
まともなレスしないんだったら口ふさいでろよ
766デフォルトの名無しさん:2005/07/03(日) 11:39:58
>>763
exit は、呼ばれるとプログラムを即座に終了するから、エラー時の処理の中断に都合が良くて使われるというだけの話。
たとえば main から関数を呼び、その関数も関数を呼び・・・ 関数の呼び出しの奥深いところで処理を中断したくなった場合、
exit を使わないでプログラムを終了するためには、奥深い関数から一つ一つ return していき、かつ処理が中断される旨
何らかの方法で main に伝えなくちゃいけない。
そういう面倒さを手っ取り早く解決するため、エラー時には exit を使ったりする。
個人的には main の return で必ず処理が終わるように構成するのが好きだから、exit は使わずに、エラーだろうと
なんだろうと main の return に到達するようにして、そこでエラーコードを返すようにしてる。
main での return 0 は、大抵はエラーではなくて正常終了のときの返却値。
767デフォルトの名無しさん:2005/07/03(日) 11:43:44
普通
retun 1;
しないか?
俺だけ?

いままでずっと 1でしてきたけど
768デフォルトの名無しさん:2005/07/03(日) 11:46:16
「普通」という言葉は微妙だが、
普通は return 0; だと思う。
769デフォルトの名無しさん:2005/07/03(日) 11:46:52
>>767
成功に0, 失敗に1を返しておくと外部コマンドとして呼び出して
yourcommand && echo succ || echo fail
みたいな感じで成否で分岐できるようになるよ。
770デフォルトの名無しさん:2005/07/03(日) 11:50:43
俺今まで5年間間違ったコードかいてきたの?
結構ユーザいるけど誰からも、訂正きたことないけどな........
771デフォルトの名無しさん:2005/07/03(日) 11:53:00
EXIT_SUCCESSで検索してみれ
772デフォルトの名無しさん:2005/07/03(日) 11:54:01
>>770
他のコマンドと連携するものじゃないんでしょ?
だったら何返しても問題は出ないでしょう。
だけどコマンドラインプログラムなんかでは、正常時には 0 を返しておくのが懸命だと思う。
773770:2005/07/03(日) 11:56:52
ありがとう
他のコマンドとの連携はないかな
Xlib使ってなんかを表示関連がおおいから

全コード修正行ってきます....
774デフォルトの名無しさん:2005/07/03(日) 11:59:01
CFAQ読めば済む話ばかりだな。
横着せずに、まじめに勉強しろよ。
775770:2005/07/03(日) 12:52:07
ふぅ、main関数の returnだけ全部修正してきた

CFAQなんて読んだことないし、Cの勉強もしたことないのであしからず
OSのコードとか、自分が使ってるアプリのコード読んでCは大体覚えていったかな
まぁ、 return 1;は 初期に自分で書いたコードはなってなかったから
どっか勘違いしてたんだとおもうな
776デフォルトの名無しさん:2005/07/03(日) 13:03:56
>>775
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

結構面白いから、だまされたと思って読んでみ。
>>1 に書いてあるリンクなんだけどな。
777デフォルトの名無しさん:2005/07/03(日) 13:05:47
人の数だけそしてその体験の数だけC FAQはある。
リンク先のFAQもその一つに過ぎない。
その死後硬直した一面的な情報にしがみつくのはいかがな物かと。
778デフォルトの名無しさん:2005/07/03(日) 13:40:32
で?
779デフォルトの名無しさん:2005/07/03(日) 13:40:49
スマソ、誤爆した。
780デフォルトの名無しさん:2005/07/03(日) 13:57:21
>>770はおまえらなんかよりぜんっぜんコードかけるやつだと思うが
781デフォルトの名無しさん:2005/07/03(日) 14:11:48
リスト構造わかんねぇぇぇぇぇぇぇぇぇぇぇぇ
782デフォルトの名無しさん:2005/07/03(日) 14:16:17
770がコード書けないと言ってるやつがいたのか?
783デフォルトの名無しさん:2005/07/03(日) 14:16:34
文字列1、文字列2をフィールドに持つ構造体を定義して、
それをある一定数、配列で宣言し、それを定義した数だけ入力して、
結果をbinファイルに出力し、出力されたbinファイルから読み出して画面に出力する。
例えば、
struct 2ch
{
char name[100];
char ita[150];
} x[10];
を定義して、main関数内で、人数を2として、
1人目
x[0].name=nanashi;
x[0].ita=program;
2人目
x[1].name=mona;
x[1].ita=program;
を定義し、その情報を"2ch.bin"に出力し、
次に"2ch.bin"から情報を読み出して、
画面に出力する。

こういうコードを書きたいのですが、binファイルに出力するところまでは出来るのですが、
その先が分かりません。

解決法をよろしくお願いします。
784デフォルトの名無しさん:2005/07/03(日) 14:26:26
>>783
ようするに、構造体の配列の内容をファイルに出力することと、
ファイルの内容を構造体の配列に戻すことがやりたくて、
とりあえず出力まではなんとかできた
という話?
ファイルから構造体の配列に値を戻せれば、後の表示はできるんだよね?

ちなみに、ファイルにはどんな形で出力したの?
fwrite(x, sizeof(*x), n, fp);
みたいに出力したなら
fread(x, sizeof(*x), n, fp);
で戻せるし、その他の方法で出力したのであれば、読み込みもその形式に合わせる必要があるわな。

それとも、書き込み時と読み込み時に一度だけ fopen したファイルポインタを使いまわそうとしたけど
うまくいかないって話?
785783:2005/07/03(日) 14:32:33
>>784
出力するところまでは
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/651.txt
こんな感じに書きました。
よろしくお願いします。
786デフォルトの名無しさん:2005/07/03(日) 14:37:58
>>773
コード書き換える前に、ユーザに連絡するのが先だろ。
もし終了コード見ているプログラムがあったらどうするんだ?
787デフォルトの名無しさん:2005/07/03(日) 14:42:44
>>785

fp=fopen("2ch.bin", "r");
for(i=0;i<n;i++) {
 char *p;
 fgets(x[i].name, sizeof(x[i].name), fp);
 if((p=strchr(x[i].name, '\n')) != NULL) *p='\0';
 fgets(x[i].ita, sizeof(x[i].ita), fp);
 if((p=strchr(x[i].ita, '\n')) != NULL) *p='\0';
}
fclose(fp);

これでどうだろう。
fgets は改行コードもバッファに入れるから、それを削除するコードを入れてみた。
fgets の EOF を監視して、ファイルの終わりを判断したりなどの改良の余地あり。

表示したいなら、この配列の内容を心行くまで表示すればいい。
788デフォルトの名無しさん:2005/07/03(日) 14:46:11
>>786
バグの重要度も考えずに大騒ぎするアホ降臨
789デフォルトの名無しさん:2005/07/03(日) 14:49:54
>>788
別にreturn 1やってもバグじゃないんだし、
大騒ぎして書き換えるほどのものじゃないと思う。
790787:2005/07/03(日) 15:05:02
fgets のかわりに

fscanf(fp, "%[^\n]\n%[^\n]\n", x[i].name, x[i].ita);

とかやるのもいいかな?
バッファをあふれないようにするのが課題だけど。

fscanf(fp, "%100[^\n]\n%150[^\n]\n", x[i].name, x[i].ita);
とかすればいい?
つーか、バッファがあふれるようなケースだと、他に考慮しなくちゃいけないことがいろいろあって面倒だね。
791デフォルトの名無しさん:2005/07/03(日) 15:10:42
結局、fgetsなど使わずに一文字ずつ読み込んで処理するのが一番便利。
792783:2005/07/03(日) 15:48:02
>>787
ありがとうございます。
790のやり方だと、うまく出来たっぽいのですが、
787のやり方だと、なんだかうまく出来てるか、出来ていないのか良くわかりません。
もともとのx[i]を表示しているように見えます。
試しに、x[]に戻すのではなくて、他にy[]を作って、そっちに読み込んで
出力したいのですが、どうすればよいでしょうか?
793デフォルトの名無しさん:2005/07/03(日) 15:53:11
そもそもfputs()はputs()と違って文字列だけ出力して、最後に改行文字は出力しないから、
785のコードではすべてのデータが1繋がりに出力されて、どこまでがnameだかitaだか区別できない。
794デフォルトの名無しさん:2005/07/03(日) 17:11:30
出題の「結果をbinファイルに出力し」に対し
fputs()はなんか違うと感じるのは俺だけですか?

784のようにfwrite()じゃないの?
795デフォルトの名無しさん:2005/07/03(日) 17:35:53
(アプリ)[学習] C言語の初歩missionC(美少女と一緒にゲーム感覚で覚えられます)(ccd).rar ラクスの呪いFO9sOp6TIu 238,635,666 9b3a16d2ec13b33cc8d039119f1228d30cd9a888
796デフォルトの名無しさん:2005/07/03(日) 17:41:48
構造体のレイアウトから見ても、ファイルへのセーブ/ロードは
fwrite/fread一発だろうな。それが一番簡単だし固定長レコードで
扱いやすい。

無論画面から読み取るのはscanfなりfgets/strtokなりを使う必要があるが。
797デフォルトの名無しさん:2005/07/03(日) 18:16:28
初心者のうちは、構造体をそのまま読み書きするのはやめとけ。
798デフォルトの名無しさん:2005/07/03(日) 18:21:10
>>797
なぜ?
799デフォルトの名無しさん:2005/07/03(日) 18:26:52
・OSやコンパイラを変えてデータを読み込むと破綻するかも。
・ポインタ・ハンドルは読み込んでも無意味。
注意事項はこんなものか。
800デフォルトの名無しさん:2005/07/03(日) 18:28:03
>>799
所詮CFAQレベルか
801デフォルトの名無しさん:2005/07/03(日) 18:33:01
初心者だからこそ、「そういうことが出来る」ことは知っておいていいと
思う。

ファイルをバイナリエディタで見れば、エンディアンや浮動小数点の
表現の問題はすぐに分かるだろうが、
コンパイラやハードウェア、OSを変えても互換性のあるファイル形式、
といった話になってくると、初心者レベルを超えたもっと高度な要求になる。

そういうことは、一度はやってみないと、なかなか理解できないものだ。
802783:2005/07/03(日) 18:34:36
fwrite,freadを用いてやってみたいのですが、上手くいきません。
fwrite,freadを用いた場合のコードを教えていただけませんか?
803デフォルトの名無しさん:2005/07/03(日) 18:38:19
プログラム板が荒れているため、IDを導入するか検討中です。
賛成の方も反対の方も、このスレで自分は賛成か反対かをお書きください。

プログラム技術板に強制ID制を導入すべきか否か
http://etc4.2ch.net/test/read.cgi/vote/1118144381/

理由などの記入は別に構いません。
<<賛成>>か<<反対>>かだけ御記入頂ければ結構です。
ちなみに、当たり前ですが運営の方にIPが見えているので、1日ごとにIDが変わるからといって多重投稿しないでください。
804デフォルトの名無しさん:2005/07/03(日) 18:39:07
コピペウゼー
805デフォルトの名無しさん:2005/07/03(日) 18:41:21
++a + a++

って、いくつになるの?
806デフォルトの名無しさん:2005/07/03(日) 18:44:01
16777216
807デフォルトの名無しさん:2005/07/03(日) 18:44:03
>>805
aの元の値が判らないのに答えろと?
808デフォルトの名無しさん:2005/07/03(日) 18:59:56
0xcccccccc として
809デフォルトの名無しさん:2005/07/03(日) 19:01:20
>>805
自信を持って私が答えよう。
答は、「いくつになるか、予測不可能」だ。
810デフォルトの名無しさん:2005/07/03(日) 19:31:25
>>805
そろそろこういうのも演算順序規定して欲しいよな
いまどきこの程度で最適化がどうのこうのもねーだろ
811デフォルトの名無しさん:2005/07/03(日) 19:36:45
Cやってるけど、GUI使ったアプリ作りたい。
Cの初心者本終えたら、C++移っていいのかな?
812デフォルトの名無しさん:2005/07/03(日) 19:37:58
いいよ。
813デフォルトの名無しさん:2005/07/03(日) 19:47:17
今更かもしれないけど。

かくほう
for (i = 0; i < n; i++) {
fwrite(&x[i], sizeof(x[cnt]), 1, fp);
}

よむほう(nが分かってるなら)
for (i = 0; i < n; i++) {
fread(&x[i], sizeof(x[cnt]), 1, fp);
}
814デフォルトの名無しさん:2005/07/03(日) 19:48:56
cntってなによ
815デフォルトの名無しさん:2005/07/03(日) 19:51:07
>>814
ドイツの哲学者
816デフォルトの名無しさん:2005/07/03(日) 19:51:53
いつものくせでつい。
817デフォルトの名無しさん:2005/07/03(日) 22:01:57
(^^)って入力したのに山崎渉と出力されません。
これは致命的な欠陥だと思います。
818デフォルトの名無しさん:2005/07/03(日) 22:09:52
>>813
/* やれやれだぜ */
fwrite(x, sizeof(*x), n, fp);
fread(x, sizeof(*x), n, fp);
819デフォルトの名無しさん:2005/07/03(日) 23:17:07
if( no % 2 )
puts(" その数は奇数です。");

これは、if( no % 2 ) の後ろに;がないんですが、行が2つに分かれてもおkなんですか?
820デフォルトの名無しさん:2005/07/03(日) 23:19:25
>>819
ok
821デフォルトの名無しさん:2005/07/03(日) 23:25:11
>>819
Cの;は行末に配置する何者かではなく、構文上の「文」を終端するためのモンだ。
だから、文の終端以外には、別に行末でも;はおかんでもよい。
822デフォルトの名無しさん:2005/07/03(日) 23:26:02
in=fopenでバイナリとしてロードファイルがあります。
fgets(buf,5,in);として4バイト読み込み、この4バイトを10進数の数値として表示させたいのですが、どうすればいいかわかりません。
教えてください。
823デフォルトの名無しさん:2005/07/03(日) 23:36:03
>>820
>>821
即レスdクスです。
このスレのおかげでずいぶん助かってます。本当にありがたいです。
824デフォルトの名無しさん:2005/07/03(日) 23:57:28
cnt'n'hok
825デフォルトの名無しさん:2005/07/04(月) 00:38:03 BE:295004467-
>>822
fgets じゃなくて fread を使うといいと思う。
826デフォルトの名無しさん:2005/07/04(月) 00:40:06
>>822
4バイトintをバイナリイメージのままファイルに書き込んであるのなら、fgets()は禁物。
int foo;
fread(& foo, sizeof(foo), 1, fp);
とでもすればいい。
但し、エンディアンに注意。
827デフォルトの名無しさん:2005/07/04(月) 01:34:14
>>812
わかったよ。
828デフォルトの名無しさん:2005/07/04(月) 08:47:10
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
829デフォルトの名無しさん:2005/07/04(月) 11:30:25
>>828
バイト単位ではなくビット単位のデータを扱うときに役にたちます。
たとえばデータ圧縮では、データの単位がバイトではなくビットであることが多々あります(しかも一連のストリーム上の
データのビット長が固定長に統一されているわけではなく、いろんな長さのデータ(1bit〜数十bitとか)が混在してたりします)。
ビットシフトは、ビット単位のデータを寄せ集めてバイト(あるいはワード)の形にまとめたり、あるいはその分解をするときに
大いに役に立ちます。
使い方がわからないうちは恐らく使う必要も無いので、今のところシフトについてそんなに気にする必要は無いでしょう。
830デフォルトの名無しさん:2005/07/04(月) 12:09:24
こんにちは

質問があります。

関数内のローカル変数として、
void func(void)
{
int num[5];
}
とあるのですが、

これを、
int ind=10;
void func(void)
{
int num[ind];
}
としたらコンパイルエラーになりました。

配列の要素数を変数で動的に変えることはC言語(C++でもかまいません)の規則上不可能なのでしょうか?

よろしくお願いします。
831デフォルトの名無しさん:2005/07/04(月) 12:11:23
>>830 C99使え
832830:2005/07/04(月) 12:17:29
C99とは何なのでしょうか。
833デフォルトの名無しさん:2005/07/04(月) 12:23:14
>>832 これやるから も う 来 る な
http://www.google.co.jp/search?num=50&hl=ja&lr=lang_ja&q=%43%39%39
834デフォルトの名無しさん:2005/07/04(月) 12:59:29
>>830
どうするかを教えてやらないと
835デフォルトの名無しさん:2005/07/04(月) 13:21:48
>>829
ばか
836デフォルトの名無しさん:2005/07/04(月) 13:23:03
>>830
ソース上で、配列のサイズを変更したいだけなら
const int ind = 10;
void func(void)
{
int num[ind];
}


本当に動的に確保したいなら
int ind = 10;
void func(void)
{
int* num = (int*)malloc(sizeof(int) * ind);

free(num);
}
837デフォルトの名無しさん:2005/07/04(月) 13:52:18
ポインタのことで質問したいのですが

typedef struct{
int a;
char b[20];
} HOGE;

void hoge( int argc, char **argc, HOGE *c){;}

void main(int argc, char **argv){
HOGE c;
hoge(argc, argv, &c)
}

というコードの意味がわかりません
hogeを呼ぶときに argcはint型なのでそのままいけることはわかるのですが
argvと、&cはなぜこのような表記になるのでしょうか?
argvは、**argc, cは、*cにはなぜならないのでしょうか?
すいませんが説明していただけるとありがたいです
838デフォルトの名無しさん:2005/07/04(月) 13:55:39
>>837
「ポインタについて何も知らないからぜんぶ説明してください」に見え
るぞ。入門書でも読みなさいな。

839837:2005/07/04(月) 14:09:17
入門書をいくつか読んだのですが理解できません

cは単に勘違いしていました
mainで宣言したcのポインタをhogeのポインタ型変数のHOGE *cに、
渡すと言う意味ですね

すいません失礼しました


ですが、argvがどうしても理解できません
すいませんが説明していただけないでしょうか?
840837:2005/07/04(月) 14:12:47
ちなみに、あっているかわかりませんが
私の推測というか見た感じのイメージでは


char **argcと宣言しているのでargcにはポインタのポインタが記憶されていて
argcとして渡すことで、hogeのchar **argcで、それをポインタのポインタとして解釈して受け取る
みたいなかんじなのでしょうか?
841デフォルトの名無しさん:2005/07/04(月) 14:14:31
>>840
その前に、hoge の第二引数は argc で合ってるの?それとも argv?
842837:2005/07/04(月) 14:17:08
すいません
argvです
失礼致しました
843デフォルトの名無しさん:2005/07/04(月) 14:21:58
C言語はじめたばかりだけどポインタって単純に
int a; //int型のa変数
int *b; //int型の変数の先頭アドレス( bにはアドレスがはいっていて b = aでaの値が入るわけではなく
// *b = a で、アドレス先にaの変数がはいる
b = &a; //aの先頭アドレスを bにいれる
って感じでとらえたんだけど俺間違ってるの?
844デフォルトの名無しさん:2005/07/04(月) 14:24:32
>>837
物事はシンプルに考えよう。

argcもargvもmain()で受け取ったままhoge()に渡している。
すなわちhoge()ではmain()と同じようにargcやargvを使える。
以上。argc, argvについてそれ以外に余計なことを考える必要はない。

cについてはそのアドレスをhoge()に渡している。
すなわちhoge()ではmain()の内部で定義されたcをポインタを介してアクセスできる。

もし仮に、hoge()からさらにhage()にそのアドレスを渡したいのであれば、
void hage(HOGE * c){...;}
となり、
hoge()内部からhage(c);と呼ばれることになる。
845デフォルトの名無しさん:2005/07/04(月) 14:32:31
>>843
あってる
846デフォルトの名無しさん:2005/07/04(月) 14:36:38
int *b;
この場合、bにはアドレスが入っていてそこに変数を入れることができるわけではなく
アンパサンドを使って他の変数のアドレスを入れることができる

これがわかったらポインタってわかると思うんだけど
わからないひとはなにがわからないのかね?
847デフォルトの名無しさん:2005/07/04(月) 15:11:35
どっかの良い解説ページにポインタ貼った方が早い気が。
848デフォルトの名無しさん:2005/07/04(月) 19:45:06
*pとp[]の違いって何ですか?
849デフォルトの名無しさん:2005/07/04(月) 19:46:41
>>848
特に無いよ
添え字が使える・使うべきときはp[]使うし
添え字が使えない・使わないべきときは*p使う
850デフォルトの名無しさん:2005/07/04(月) 19:47:23
>>848
まず質問が変
851デフォルトの名無しさん:2005/07/04(月) 20:06:57
>>849
嘘を教えるな
852デフォルトの名無しさん:2005/07/04(月) 20:21:39
>>849
演算子の優先度が違う。
p[x]は*(p+x)と等価だと、お釈迦様も言っておる。
それとも宣言とか引数の中での話?
853デフォルトの名無しさん:2005/07/04(月) 20:22:03
まちがえた、>>848だった。
854デフォルトの名無しさん:2005/07/04(月) 20:32:31
C言語をはじめたばかりであまりわからないのですが、
ビットフィールドはなんの役に立つのでしょうか?
855デフォルトの名無しさん:2005/07/04(月) 20:34:30
役に立ちそうで役に立たない。
856デフォルトの名無しさん:2005/07/04(月) 21:04:12
>>854
環境限定でデータをキツキツに詰め込む時に使う。
857デフォルトの名無しさん:2005/07/04(月) 21:06:32
メモリマップドIOには結構使えると思う。
858デフォルトの名無しさん:2005/07/04(月) 21:14:25
"H8 SCI BRR SSR" 辺りで検索するとビットフィールド使いたくなる
理由が分かるかも。
859デフォルトの名無しさん:2005/07/04(月) 21:16:56
>>855-858
いいかげんくだらないコピペにレスするのやめてくれないかな
860デフォルトの名無しさん:2005/07/04(月) 21:24:01
>>859
いい加減だまっててくれないかな?
861デフォルトの名無しさん:2005/07/04(月) 21:30:01
こんにちわ
862デフォルトの名無しさん:2005/07/04(月) 21:36:53
>>861
Hello World!!
863デフォルトの名無しさん:2005/07/04(月) 21:39:41
質問があります。

{ }の範囲のことを何と呼ぶのでしょうか?
「区画」?

何か定義されてる名前があると思いますが。
864デフォルトの名無しさん:2005/07/04(月) 21:41:18 BE:38820454-#
スコープ
865デフォルトの名無しさん:2005/07/04(月) 21:41:23
括弧
866デフォルトの名無しさん:2005/07/04(月) 21:41:31
>>863
block
867デフォルトの名無しさん:2005/07/04(月) 21:41:46
ぺちゃぱい
868デフォルトの名無しさん:2005/07/04(月) 21:42:17
>>863
中括弧と中括弧の間
869デフォルトの名無しさん:2005/07/04(月) 21:42:36
横顔
870デフォルトの名無しさん:2005/07/04(月) 21:43:30
{}
遠くから見た埴輪君
871デフォルトの名無しさん:2005/07/04(月) 21:43:43
>>863
手書きが難しい例の尖った括弧の間
872デフォルトの名無しさん:2005/07/04(月) 21:45:35
______________
{本日は晴天なり|
~~~~~~~~~~~~~~~
どこでも簡単吹き出し君二号
873863:2005/07/04(月) 21:45:40
>>866
ありがとうございました。
874<- = 865, 867, 869, 870, 872 :2005/07/04(月) 21:47:23
わりとがんばったのに
一人しか付いてきてくれなかった
875デフォルトの名無しさん:2005/07/04(月) 23:12:37
if文でどちらかの条件をみたしたら真っていうのできないですか?
k=1の時の場合なら
if(k==1){
}
ですよね。k=1またはk=3の場合に真の処理をしたいのですが
876デフォルトの名無しさん:2005/07/04(月) 23:14:03
>>875
if (k == 1 || k == 3) {
}
ちなみに両方の条件を満たした場合というのは&&。
877デフォルトの名無しさん:2005/07/04(月) 23:14:54
>>876
ありがとうございます!
878デフォルトの名無しさん:2005/07/04(月) 23:39:51
#include <stdio.h>
float avg(int ,float ,float );
main()
{
float x,y;
int n;
printf("データを入力してください!");
n=1;
while(n){
printf("入力値%d= ",n);
scanf("%f",&x);
if(x == 0.0) break;
n++;
}
float avg(int n,float x,float y)
{
float b;
b = (x+y)/2;
return b;
}
このプログラム回らないんですけど、
どうしたら、回りますか??
教えてください。お願いします
879デフォルトの名無しさん:2005/07/04(月) 23:43:54
>>878
マルチかよ。
しっかりインデントつけろ、そうすりゃ分かる。
880デフォルトの名無しさん:2005/07/04(月) 23:45:33
>>879
そういう次元じゃないんだよね、これ。
881デフォルトの名無しさん:2005/07/04(月) 23:47:54
>>878 これあげるから 二 度 と 来 な い で ね ♥
#include <stdio.h> 
float avg(int n,float x,float y) {return (x + y) / 2;}
int main(void) {
    float x, y; int dummy;
    printf("データを入力してください!"); 
    if (scanf("%f%f", &x, &y) != 2) return 1;
    printf("%fと%fの平均:%f\n", x, y, avg(dummy, x, y));
    return 0;
}
882デフォルトの名無しさん:2005/07/04(月) 23:48:55
>>880
じゃどういう次元?
インデント揃えて、足りないブレース一個でコンパイルは通るが?
883デフォルトの名無しさん:2005/07/05(火) 00:01:37
>>882 それを「回る」と表現する?
884デフォルトの名無しさん:2005/07/05(火) 00:12:31
ヒント:「平均」とは?
885デフォルトの名無しさん:2005/07/05(火) 00:12:53
>>881
(・・?)ナゼ?、関数がうえにあるのでしょうか??
886デフォルトの名無しさん:2005/07/05(火) 00:13:24
>>885 新でください
887デフォルトの名無しさん:2005/07/05(火) 00:16:04
>>885
(・・?)ナゼ?、>>881がこのスレにあるのでしょうか??
888デフォルトの名無しさん:2005/07/05(火) 00:20:11
>>880
おしえてクンの次元が違うということでFA?
889デフォルトの名無しさん:2005/07/05(火) 02:35:13
890デフォルトの名無しさん:2005/07/05(火) 03:41:35
main関数じゃない関数で宣言した変数を違う関数から使う方法はありませんか?
891デフォルトの名無しさん:2005/07/05(火) 03:49:00 BE:196670047-
>>890
別に変数の宣言は関数内部でなくても構わない。

int n;

void f()
{
 n=1;
}

int main()
{
 f();
 printf("%d\n",n);
 return 0;
}
892890:2005/07/05(火) 03:52:03
いや、グローバル変数はだめなんですよ
完全に、main関数じゃない関数で宣言した変数です
893デフォルトの名無しさん:2005/07/05(火) 04:10:53
int *intptr(){ static int ret; return &ret; }
main(){ int *p = intptr(); *p = 10;
894デフォルトの名無しさん:2005/07/05(火) 04:15:33
>>890
ない。
どうしてもやりたければ、変数の値をコピーすることで代用するしか無い。
895890:2005/07/05(火) 04:26:41
変数の内容をコピーってどういうことですか?
896デフォルトの名無しさん:2005/07/05(火) 04:52:18 BE:280956285-
>>895
具体的に何をしたいのか書かないと答えようがない。

void f(int *pa,int *pb)
{
 int a,b;
 a=ごにょごにょ
 b=もにょもにょ
 *pa=a;
 *pb=b;
}

int main()
{
 int a,b;
 f(&a,&b);
 printf("a=%d,b=%d\n",a,b);
 return 0;
}
897デフォルトの名無しさん:2005/07/05(火) 05:05:45
staticで宣言されてたり、mallocで確保されてるなら、
コピーしなくても、ポインタを返すだけでもいいんでないの?
898890:2005/07/05(火) 05:07:47
うんこやないねんから、そんなこてゃできへんよ

やりたいことは、
Display構造体の変数をdisp関数で作って、
それを、どっからでも使えるようにしたい
グローバル変数はだめ
今までは、mainで宣言してdispに構造体を渡してたけど
dispで宣言しなわかりづらいからね
899デフォルトの名無しさん:2005/07/05(火) 05:18:14
なぜグローバル変数がダメなんだ?
900890:2005/07/05(火) 05:20:33
グローバル変数はつかったら負け
901デフォルトの名無しさん:2005/07/05(火) 05:31:49 BE:126431036-
ダメな理由はわかってるんだろうな…?
わかってないでそんなこと言ってるんだったらそれこそ負け組だが。
グローバル変数使ったってファイル分けりゃカプセル化可能。

Cでグローバル変数を使わずにできるアプローチは>>896>>897
それが嫌ならC++。
902デフォルトの名無しさん:2005/07/05(火) 05:34:02
ファイル分けりゃとか言ってる時点で>>901もボケ
903デフォルトの名無しさん:2005/07/05(火) 05:47:23 BE:140478645-
どの辺がボケなんだか言ってみろよ。static変数使えば名前の衝突もないだろ。
最近中身のない煽りが多くてイライラしてんだよ。とっとと消えろ。
904デフォルトの名無しさん:2005/07/05(火) 05:54:28
プログラムの流れが読みにくくなるし、初期化の問題も絡んでくるだろ
ファイル分けてカプセル化とか、アホかお前は
905デフォルトの名無しさん:2005/07/05(火) 05:57:33 BE:70239825-
カプセル化って言ってるだろ。
別ファイルなんてブラックボックスなんだから流れなんが見えなくていい。
インターフェースさえ明確ならそれでいい。
906デフォルトの名無しさん:2005/07/05(火) 05:59:40
カプセル化したら、そのままじゃ、メインから使えないわな。
まあ、その場合、通常はポインタをゲットする関数を作るわけだが。

> プログラムの流れが読みにくくなる
カプセル化の意味ねーーーー
普通は読みやすくするためにカプセル化するんだよ

初期化は、disp内で変数宣言するって言ってるんだから、
disp内でやればいいだろ
907デフォルトの名無しさん:2005/07/05(火) 06:00:22
しまった、かぶったか
908デフォルトの名無しさん:2005/07/05(火) 06:06:00
>>898
main() { Display display; disp(&display); }
のかわりに
main() { Display *display; display = disp(); }
とすればいいだけの話か?
909デフォルトの名無しさん:2005/07/05(火) 06:14:03
「どこからでも使えるように」って言ってるから、
main以外の関数からもポインタを取得できるようにするには、
disp関数をイニシャライザとして、
コレとは別にポインタ取得用の関数が欲しいと思うのは俺だけ?
910デフォルトの名無しさん:2005/07/05(火) 09:13:25
おいおい、まだ109かよ。
911デフォルトの名無しさん:2005/07/05(火) 10:54:19
置換マクロでの戻り値の取得方法を教えて下さい。

プログラム中に双方向リストのノード追加や削除と言った操作があるのですが、双方向リストが2つ以上存在する為、リストごとの追加や削除といった操作を置換マクロを使って一元管理したいのです。
削除や挿入操作は引数があれば出来たのですが、挿入操作は新しくリストを生成した後、そのリストのポインタを返却したいのです。
(関数であればreturn文で問題無かったのですが……)

どうか、置換マクロでの戻り値の方法を教えて下さい。

912デフォルトの名無しさん:2005/07/05(火) 11:05:32
最近ダメ出しだけで、代用案を出せない煽りが多すぎる。
913デフォルトの名無しさん:2005/07/05(火) 11:09:19
>>912
代用案:そういうアホは無視すればいい
914890:2005/07/05(火) 11:13:10
ダメなりゆうわかってないんだろうな とかそれ以前にダメっていってるのに
まさか あほなの?
あほなんでしょ?

質問者の注文どうりの答えが出せないんなら
口ふさいでろよ
915デフォルトの名無しさん:2005/07/05(火) 11:46:55
>>911
関数でええやん、という気もするが。

挿入操作が式 foo、式 bar、その後値 newlist を返すとすると、

#define LIST_INSERT(oldlist,ent) foo, bar, newlist

とカンマ演算子を使うとか、

#define LIST_INSERT(oldlist,ent,dest) foo; bar; dest = newlist

と代入先もマクロ引数に含めてしまうとか。
916デフォルトの名無しさん:2005/07/05(火) 12:15:38
>>898
Display *disp()
{
 static inited = 0;
 static Display d;
 if(!inited) {
  初期化処理とか
  inited = 1;
 }
 return &d;
}

これでどうか?
呼び出すだけでポインタが得られる。
これやるよりはファイル分け案の方が読みやすくなる気がするけど。

だけど、こういう方法だと、Display の実体をもう一つ欲しくなったときとかに修正が大変になるから、
全ての関数に Display* を渡すようにするのが汎用性が高くなると思う。
上記関数に引数を与えられるようにして、関数を賢くすればいいのかもしれないけど。
917デフォルトの名無しさん:2005/07/05(火) 12:17:01
>>914
>ダメなりゆうわかってないんだろうな とかそれ以前にダメっていってるのに
理由以前にダメなんですか。へー

>質問者の注文どうりの答えが出せないんなら
どうり?

>口ふさいでろよ
園児か。
918デフォルトの名無しさん:2005/07/05(火) 12:23:11
プログラムなんて動けばいい。所詮紙くずに書くようなメモに過ぎない。
グローバル変数があるんだから素直に使っとけばいいじゃん。
コメントなりなんなりで、間違えないよう注意するようにしてさ。
と、思う俺は負け組み?
919デフォルトの名無しさん:2005/07/05(火) 12:26:57
お前等Displayがなにかわかってないだろ
Display *disp;
disp = XOpenDisplay(NULL);
だぞ、
Displayはポインタで宣言する
920デフォルトの名無しさん:2005/07/05(火) 12:27:53
>>918
適材適所でしょ。
グローバル変数にして有利になると思えばそうすればいいだけ。
errno なんかもグローバル変数なわけだし。
921デフォルトの名無しさん:2005/07/05(火) 12:29:45
ついに突っ込んじゃったよ
みんなわかってなくてレスしてたのが面白かったのに
922デフォルトの名無しさん:2005/07/05(火) 12:30:37
>>919
ポインタだろうとなんだろうと >>916 の方法でイケるのではいか?
ようするにこうか?

Display *disp()
{
 static Display *d = NULL;
 if(d==NULL) {
  d = XOpenDisplay(NULL);
  その他処理
 }
 return NULL;
}
923922:2005/07/05(火) 12:32:21
まちがえた

× return NULL;
○ return d;
924デフォルトの名無しさん:2005/07/05(火) 12:34:07
>>921
もしかしてdispをグローバルにできない理由って、

Display *disp = XOpenDisplay(NULL);

int main()
{
 ・・・
}

って書いたらコンパイルが通らなかったからですか?
925デフォルトの名無しさん:2005/07/05(火) 12:41:37
>>914
一番の解決策は設計を見直す事だと思うよ。
926デフォルトの名無しさん:2005/07/05(火) 12:42:52
>>914
だから、そもそもできないって言ってるのに。
927デフォルトの名無しさん:2005/07/05(火) 15:25:53
char *で定義されたパラメタから以下の文字列が引継がれます
'EXPORT/HOME/USER/DATA0706.TXT'
パス部とファイル名称部をうまく切り分ける方法を教えてつかあさい
928デフォルトの名無しさん:2005/07/05(火) 15:35:29
>>927
strrchr
929うんちまん:2005/07/05(火) 16:32:02
_splitpath
_makepath 環境依存だったりして(ぉ
930デフォルトの名無しさん:2005/07/05(火) 17:14:29
つーか POSIX に basename と dirname があるだろ。
931デフォルトの名無しさん:2005/07/05(火) 17:16:41
int i;
char *p;
char *tmp[20];
for(i=0;p=_mbschr(str,'/');i++)
{
tmp[i]=p;
}
思いつきカキコ(動作するのか?)
後ろからn番目の特定の文字cを探すことって
結構あるんだが、良い方法がわからん
932デフォルトの名無しさん:2005/07/05(火) 17:18:14
ああ、ミスったまま・・・市にたい
933927:2005/07/05(火) 17:38:43
みなさま。ありがとうございました。
作動しはじめました。
934デフォルトの名無しさん:2005/07/05(火) 19:49:55
これを再帰にしてください。

abc(int x,int y,int j,int k){
int i;
if(x<y){
for(j=x;j>0;j--){
if (x % j == 0){
k = j;
if(y % k == 0){
printf("CMN = %d\n",k);
j = 0;
}
}
}
}
if(x>y){
for(j=y;j>0;j--){
if (y % j == 0){
k = j;
if(x % k == 0){
printf("CMN = %d\n",k);
j = 0;
}
}
}
}
}
935デフォルトの名無しさん:2005/07/05(火) 20:15:10
すみませんちょっと教えてください

typedef struct {
  char cHage1 : 1;
  char cHage2 : 1;
} HAGE;

の : ってどういう意味があるんですか?

あと

static Hage;

って変数の宣言見たんだけどこれってなに型?どういう意味なの?
よろしくおながいします。
936デフォルトの名無しさん:2005/07/05(火) 20:16:34
>>935
ビットフィールドでググレ。

> static Hage;

int 型
937デフォルトの名無しさん:2005/07/05(火) 21:48:18
>>935
int は省略しない方がイイ
C99ではアウトだから余裕があるなら直すべし
938デフォルトの名無しさん:2005/07/05(火) 22:05:46
2次元配列のポインタの宣言なんですが

int a[5][5]={
{1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25}};

int b[5][5]={
{3,6,9,12,15},
{18,21,24,27,30},
{33,36,39,42,45},
{48,51,54,57,60},
{63,66,69,72,75}};
//値はどうでもいい
int c[5][5];
int *p_a,*p_b,*p_c;

p_a = a;
p_b = b;
p_c = c;

intをいっぱい書いてるのにも特に意味はありません。
最後の三行の部分でエラーが出てしまいます。メッセージは
「error C2440: '=' : 'int [5][5]' から 'int *' に変換することはできません。(新しい動作 ; ヘルプを参照)
指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。」

です。わけわからんちんorz
宿題っぽい匂いはかもし出してますが、宿題じゃありません。
どこがおかしいのか指摘おながいします
939デフォルトの名無しさん:2005/07/05(火) 22:06:59
int (*p_a)[5][5], (*p_b)[5][5], (*p_c)[5][5];
940939:2005/07/05(火) 22:10:30
違った、これjじゃそうはできないか。 pa_a = &a;なっちまう。


int *pa_a = a[0];


こうだな。
941デフォルトの名無しさん:2005/07/05(火) 22:12:03
こうもかけるが、いやな感じだな。

int *p_a = *a;
942デフォルトの名無しさん:2005/07/05(火) 22:13:37
int (*p_a)[5], (*p_b)[5], (*p_c)[5];
943デフォルトの名無しさん:2005/07/05(火) 22:31:45
>>939-942
なるほど・・・多次元配列に関するポインタにはポインタ自体の配列を
なんちゃらしないといけないんですね。

ありがとうございますた!
944デフォルトの名無しさん:2005/07/05(火) 22:34:59
>>943
何か勘違いしてるだろ。

int (*p_a)[5];
は配列ではないぞ。
945デフォルトの名無しさん:2005/07/05(火) 22:35:53
a[0] は配列だな。
946デフォルトの名無しさん:2005/07/05(火) 22:36:04
うむ。配列自体へのポインタとでも言えば良いか。
947デフォルトの名無しさん:2005/07/05(火) 22:36:52
ポインタの配列 と 配列へのポインタ
948デフォルトの名無しさん:2005/07/05(火) 22:51:49
ここらへんがわかればもう、Cはお腹いっぱいって感じだぉね










と言ってみるテスト
949デフォルトの名無しさん:2005/07/05(火) 22:57:03
シンタクス汚くて理解しにくいだけなんだけどな
関数ポインタと配列が絡んでそれを返す関数ポインタへの配列とかな

要は一度きっちり理解して、後はtypedefでも使ってろってだけだが
950943:2005/07/05(火) 23:37:09
>>946これでなんとなく分かったような分からんような

もっと勉強してきますλ.....
951デフォルトの名無しさん:2005/07/06(水) 00:33:30
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/669.txt

いわゆるハイ&ローを作りたいのですが、↑のソースだとバグだらけになってしまいます。
(当りなのに外れ等)
どこをどうすればいいのでしょうか?
952デフォルトの名無しさん:2005/07/06(水) 00:37:06
新ルール?
953デフォルトの名無しさん:2005/07/06(水) 00:59:05
>>951

for(j=0; j<9; j++){      // 10回も回すな!
   fflush(stdin);       // 前回scanfのゴミが残ってるから掃除しとけ
   scanf("%c",&bs);
954デフォルトの名無しさん:2005/07/06(水) 01:04:26
CFAQ嫁
fflush(stdin); // 前回scanfのゴミが残ってるから掃除しとけ
955デフォルトの名無しさん:2005/07/06(水) 01:12:35
scanf を scanf("%c%*c",&bs); に変える
else printf("入力が違います\n次は?->"),j--; を最後に付け加える
956デフォルトの名無しさん:2005/07/06(水) 01:13:23
てか、Cなんだから//コメント使うなよ
C99前提か?
957デフォルトの名無しさん:2005/07/06(水) 01:16:01
C99じゃなくても一行コメントは有名所のコンパイラは対応してるだろ
958デフォルトの名無しさん:2005/07/06(水) 01:19:37
>>957
コメント程度の問題で
敢えてコンパイラ独自拡張に手を染めることも無かろ?

959デフォルトの名無しさん:2005/07/06(水) 01:20:12
誰か○×ゲームを作れる神はいませんか?orz
2人が交互に座標を指定していくというもの。
課題で出たけどワケワカラン('A`)
960デフォルトの名無しさん:2005/07/06(水) 01:20:53
>>959
宿題丸投げは専用スレで。
961デフォルトの名無しさん:2005/07/06(水) 01:42:39
コメント程度っていうんなら気にするなよ
962デフォルトの名無しさん:2005/07/06(水) 01:44:39
質問と関係なく間違ってもいないことをグダグダ言うアホはスルー
963デフォルトの名無しさん:2005/07/06(水) 01:48:37
964デフォルトの名無しさん:2005/07/06(水) 01:49:52
座標を指定していくって
座標を指定する時点で○×じゃないだろ
965デフォルトの名無しさん:2005/07/06(水) 01:50:35
966デフォルトの名無しさん:2005/07/06(水) 01:57:40
>>964は質問と関係あるだろ
967デフォルトの名無しさん:2005/07/06(水) 03:58:46
>>959
仮想テーブルとか訳のわからんコメント入れたままだった・・・気にせずに頼む
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/671.cpp

スレ違いだけど許してくださi
小学生並み低脳のお節介なので、どうかスルーで もういなかったら悲しいけど
968デフォルトの名無しさん:2005/07/06(水) 04:15:18
>>967
ごめn 横ラインチェックのところ
if ( p[v*3] == p[h + v * 3] && p[h + v * 3] ) に直しといて。
これじゃ、2段目以降が判定されていない、迂闊。
あと定数散りばめてたり、e キー押した時は exit になってたり、めちゃくちゃだから
その辺の修正ぐらいしといてくだせぇ
969デフォルトの名無しさん:2005/07/06(水) 05:46:31
こんな探索プログラムをつくったのですが、色々考えてやっても
どうしても探索失敗になってしまいます。どう修正したらいいのでしょうか?

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/673.txt
(↑コンパイルは通るので実行できます)
970969:2005/07/06(水) 05:48:52
それから、次スレ立てておいたんで

C言語なら俺に聞け! Part 110
http://pc8.2ch.net/test/read.cgi/tech/1120596481/
971デフォルトの名無しさん:2005/07/06(水) 06:09:05
>>969
まず簡単な検索の概要について説明してもいいんじゃない?
そこまでソース読んで汲み取れと?
972デフォルトの名無しさん:2005/07/06(水) 06:38:52
>>969
細かく見てないから、移動のルールとかはよく解らんが、
探索のアルゴリズムの大まかな流れはOKのような気がする。
がしかし、移動において変数frontが常に0のままなのだが・・・・
973969:2005/07/06(水) 07:25:37
>>971
そりゃそうですね・・・orz

概要ですが、
現在の状態から展開できるだけ全ての状態を展開して、
それに対して順列を使って番号付けして、現在の状態と対応させておいて、
目標状態になったら格納しておいた状態番号と状態に従って最初の状態までたどって
解を得るといった感じです。
974デフォルトの名無しさん :2005/07/06(水) 09:24:09
int型整数の三乗値を返す関数はどうすればいいですか?
975デフォルトの名無しさん:2005/07/06(水) 09:29:04
int a = 3;
a = a * a * a;
return a;
976デフォルトの名無しさん:2005/07/06(水) 09:33:10
Display *hoge;
hoge = XOpenDisplay(NULL);
if( !hoge ){
perror(XOpenDisplay);
}
とはどういう意味でしょうか?

!hoge はどういういみなのでしょうか?
977デフォルトの名無しさん:2005/07/06(水) 09:37:07
どんな入門書にも書いてある
978デフォルトの名無しさん:2005/07/06(水) 09:39:00
かいてない
979デフォルトの名無しさん:2005/07/06(水) 09:40:19
>>974
抜けてました
int cube(int x) {/*・・・*/}
を作成せよでした
980デフォルトの名無しさん:2005/07/06(水) 09:46:53
かいてませんから。
if (a != b) {
というのがありますから、hoge ではないということ。
0か、そうでないかでtrue | false を判定。
例えば while(FindNextFile(省略)) は一見出られないが、
実際は確実に出られる。
hoge を-1,0,1,100 にして さあ、実験。
981デフォルトの名無しさん:2005/07/06(水) 09:47:37
自分で調べる気が全く無いんだな、976=978は。
982デフォルトの名無しさん:2005/07/06(水) 09:48:58
>>976の場合
絶対にエラー終了するんでないかい?
983デフォルトの名無しさん:2005/07/06(水) 09:49:30
!演算子の意味が書いてないなんて、
976=978=980は、なんて名前の入門書を使っているんだい?

>>979宿題は(以下略
984デフォルトの名無しさん:2005/07/06(水) 09:50:29
うむ、始めたばかりの俺様も思った
アドレスが入ってるから絶対にperrorにながされるんじゃないの?
985デフォルトの名無しさん:2005/07/06(水) 09:54:13
> アドレスが入ってるから絶対にperrorに
は?

もしかして、
FILE *fp;
fp = fopen(...);
if (!fp) {
 perror(...);
}
も、必ずエラーになると思ってる?
986デフォルトの名無しさん:2005/07/06(水) 09:56:16
初心者は回答するなよ。

!hogeは、hoge == 0 と等価だ。
987984:2005/07/06(水) 09:58:17
ごめんねばかで

それは、fopenでエラーが出たらperrorに流されるんでしょ

あ、ifは正の数だったら流すんだっけ?
988984:2005/07/06(水) 09:59:15
989デフォルトの名無しさん:2005/07/06(水) 10:02:11
printf( "ファイルの大きさ : %ld\n", FileSt.st_size );

上記で表示される結果(数値)を
char strLine[MAX_PATH];で定義したシンボルに格納したいのですが
どうすればよいでしょうか?
990デフォルトの名無しさん:2005/07/06(水) 10:02:44
> あ、ifは正の数だったら流すんだっけ?

おい
991デフォルトの名無しさん:2005/07/06(水) 10:04:50
>>989
数字を文字列に直して入れたいのか?
だったら少しは頭を使え。
992デフォルトの名無しさん:2005/07/06(水) 10:11:56
>>991
はいその通りっす。

char strSize[10];

wsprintf(strSize,"%d",FileSt.st_size );
strcpy( strLine,strSize);

でコンパイルは通るのですが、値がとれていないようです。
おながいします。
993デフォルトの名無しさん:2005/07/06(水) 10:20:50
もしかしてもしかすると
頭悪い?
994デフォルトの名無しさん:2005/07/06(水) 10:46:09
はいオフコースです師匠!!
お慈悲を〜
995デフォルトの名無しさん:2005/07/06(水) 11:21:36
>>984
> アドレスが入ってるから

アドレスが入っている、と言う時点で間違い。
996986:2005/07/06(水) 12:02:32
>>984=>>988
なにか?
997989:2005/07/06(水) 12:57:32
すみません。私のC言語も助けていただけますと嬉しく思います。
998デフォルトの名無しさん:2005/07/06(水) 13:03:13
記念カキコ v(^-^=)
999デフォルトの名無しさん:2005/07/06(水) 13:05:01
>>1000が答えてくれるらしい。
1000デフォルトの名無しさん:2005/07/06(水) 13:05:26
1000GET!! v(^-^*)
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。