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

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

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

コンパイラを探しているなら >>2-13 を。
C machineはCに非ず
上記を逸した場合の結果は激しく未定義だYO!

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

C言語なら俺に聞け! Part 60
http://pc2.2ch.net/test/read.cgi/tech/1056806789/
【コンパイラ】
gcc
http://gcc.gnu.org/

【Win32用の開発環境のみ。】
gcc-cygwin
http://www.redhat.com/software/tools/cygwin/
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/

【ライセンスや機能などに問題あり】
Microsot 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
3_:03/07/09 00:11
4デフォルトの名無しさん:03/07/09 00:11
>>1
乙NULL
54:03/07/09 00:12
宣伝に負けた( ̄o ̄;)
宣伝君をだれか出入り禁止にしてくれ。鬱陶しくてかなわん。
>>6
禁止は無理だけど、削除依頼してくれれば消すよ。
8デフォルトの名無しさん:03/07/09 00:23
MTっていう乱数生成アルゴリズム知ってますか?
有名だな
>>2-13なのに続きが現れる気配なし…
>>10
ねーもん
インタプリタのサイトはテプレから外さないか?
13デフォルトの名無しさん:03/07/09 00:28
と亀さんはいった。
亀さんそれじゃあだめだよ。
なまらやる気の無い亀さん?
東京発13:XXのぞみXX号に乗って静岡駅で降りる
ここまでは、目撃されている情報から間違いがない
そして、今度は東京行きのぞみXX号にのって…
18デフォルトの名無しさん:03/07/09 00:55
fread ってどするの?
よむんだよ。
>>18
#include <stdio.h>
typedef size_t At;
typedef const void * N;
typedef size_t T;
typedef FILE * DoCoMo;

At fread(N,T,T,DoCoMo);
21前スレ912:03/07/09 01:31
レス遅くなりました。
前スレの913,914さん、ありがとうございました。
特に914さんの説明、かなり納得できました。
どうもでした。
#include <stdio.h>
#include <stdlib.h>
int main(){
int a=1000,b=1000,i=0,mina=0,minb=0,r=rand();
printf("%d %d %d\n",i,a,b);
for(i=1;i<100;i++){
if(16000<r&&r<24000){
a+=4; b-=4;
}
if(24000<r&&r<32000){
a-=2; b+=7;
}
if(mina<a) mina=a;
if(minb<b) minb=b;
printf("%d %d %d\n",i,a,b);
}
printf("mina=%d minb=%d\n",mina,minb);
}
どんな(1-32768のどれか)乱数を出すかで、乱数がどの範囲に入るかで
a,bの値が下がったり上がったりするプログラムを作ったつもりなんですが、
aの値もbも1000を出力したままずっと変わりません。何でなんですか?
r = rand() がループの外だから
C言語についてなんですが、文字コード番号を打って入力し、出力する方法が分かりません。
どなたか知ってたら教えてください
日本語についてなんですが、脳内語を入力し、口語を出力する方法が分かりません。
どなたか知ってたら教えてください
2722:03/07/09 03:32
#include <stdio.h>
#include <stdlib.h>
int main(){
int a=1000,b=1000,i=0,j,mina=1000,minb=1000,a0=0,b0=0;
printf("%d %d %d\n",i,a,b);
for(j=0;j<20;j++){
for(i=1;i<100;i++){
if(16000<rand()&&rand()<24000){
a+=4; b-=4;
}
if(24000<rand()&&rand()<32000){
a-=2; b+=7;
}
if(mina>a) mina=a;
if(minb>b) minb=b;
printf("%d %d %d\n",i,a,b);
a0+=mina; b0+=minb;
}
printf("mina=%d minb=%d\n",a0/1000,b0/1000);
}
}
上のプログラムにちょっと付け足したものです。
mina,minbを試行で何度も出して、試行回数で割って
平均値を求めようとしたんですけど、mina,minbは変な値が出てきました
普通は1000程度の数がでます。どこがおかしいんでしょうか?
>>22
おまい、わざとだろ
>27
>if(16000<rand()&&rand()<24000){
最初のrand()と二つ目のrand()は別の値になる。
30前スレ1000:03/07/09 09:05
マヌケだ…
31前(々)スレ999:03/07/09 09:07
勝った・・・
#include <stdio.h>

int main(void)
{
char str[] = "abcdefg";
int k;

for(k = 0; k < 7; k++){
if(str[k] == "b"){
printf("%s\n", str);
break;
}
}
return 0;
}

abcdefgが出力されるはずなんですが・・・。
移植性の無いポインタ変換という警告が出てます。
よろしくお願いします。
33デフォルトの名無しさん:03/07/09 09:42
関数内で fopen したファイルのポインタを呼び出し元に返すことは可能か?
例えば、こんな感じ。

main(){
 FILE *file;
 func(file);
}

void func(FILE* f){
f=fopen("xxx", "r");
}

この場合、勝手にクローズされちゃう?
>>32
str[k] と "b" を比較しているから。

>>33
当然可能。勝手にクローズするはずがない。行方不明になるが。

>>33

void func(FILE** fp) {
 *fp = fopen(...);
}

FILE* func() {
 return fopen(...);
}
3633:03/07/09 09:53
ごめんなさい。書き方悪かった。
return しないでできる?引数渡しで。
出来るってばよ。
>>36
35を良くみろ。
returnしなけりゃ処理が戻ってこないから難しいな。
40デフォルトの名無しさん:03/07/09 11:23
質問
varchar型に格納されている文字列の比較ってどうやるん?
そのまま == で比較したらキャストエラーが出るのだが

varchar A[10][5];
varchar B[10][5];

---詳細省略--------------------------------------------
varcharのA配列にSQLで取った値をカーソルFETCHで値格納
varcharのB配列にSQLで取った値をカーソルFETCHで値格納
-------------------------------------------------------

if(A[1].arr == B[1].arr){

}
Cにvarcharなんていう型はありません。
42デフォルトの名無しさん:03/07/09 11:32
Pro*Cは駄目なの?
>>1
>>40
AとBは二次元配列だから、添え字がおかしいんじゃないの?

あと、varchar同士の比較は、長さを比較して、一致してたら
memcmpを使えばいいのかな?
Pro*Cって知らんから、間違ってるかもしれんけど。
Pro*cは、SQLをCのソースに埋め込む開発ツールですな。
ということで、スレ違いなんだってばさ。
激しくアフョ丸出しで悪いんだけど、
画面をクリアする方法ってどこ探しても載ってないんすよね・・・
>>46
載ってる。
>>46
Cと関係ないからな
system("cls"); /* Windows/MS-DOS */
system("clear"); /* UNIX/Linux */
int i;for(i=0;i<1000;i++){printf("\n");}
5146:03/07/09 15:12
>>49
激しく感謝。
C言語ならオレだよオレオレ
>>52
すげえ。C 言語とかいっといてオレだよとかいってるよ。この人。
>>53
それ言うならスレタイが既に(ry
55デフォルトの名無しさん:03/07/09 18:10
>>40
if(A[1].arr == B[1].arr)
でなくて
if(strcmp(A[1].arr, B[1].arr)==0)
では。
5655:03/07/09 18:22
厳密に言うと
if (A[1].len == B[1].len
&& strcmp((char*)A[1].attr, (char*)B[1].attr)==0)
かな。スレ違いなのでこれくらいに。
57_:03/07/09 18:32
>>56
varcharの文字列は0がついてるとは限らないから、strcmpで比較はまずいよ。
strncmp
>>52はオレオレ詐欺!
61デフォルトの名無しさん:03/07/09 20:48
registerは古くさいですか?
62デフォルトの名無しさん:03/07/09 20:49
名無しさん  2003/07/09(Wed) 19:20

◎無修正画像をご覧下さい◎無料パスワードをゲットすれば、もっと凄い画像とムービーがご覧頂けます◎
      ★見て見ておまんこ★
http://yahooo.s2.x-beat.com/linkvp/linkvp.html
63デフォルトの名無しさん:03/07/09 20:54
staticって何ですか?
「静的変数」と言われても良く分かりません。
古いです。
#include <stdio.h>
#include <stdlib.h>
int main(){
int a[99],i1,i2,i3,i4;
for(i1=0;i1<99;i1++){
a[i1]=rand()%51;
}
for(i2=1;i2<12;i2++){
for(i3=0;i3<99;i3+=49){
while((a[i3]==a[i3+1]||a[i3]==a[i3+2]||a[i3]==a[i3+3]||a[i3]==a[i3+4]||a[i3+1]==a[i3+2])
||(a[i3+1]==a[i3+3]||a[i3+1]==a[i3+4]||a[i3+2]==a[i3+3]||a[i3+2]==a[i3+4]||a[i3+3]==a[i3+4])){
a[i3+1]=a[i3+1+(4*i2)]; a[i3+2]=a[i3+2+(4*i2)]; a[i3+3]=a[i3+3+(4*i2)]; a[i3+4]=a[i3+4+(4*i2)];
}
i4=(i3/49)+(i3%49);
printf("a[%d]=%d\n",i4,a[i4]);
}
}
}
トランプを5枚配ったときのトランプの出方を出力使用としたのに、
このソースでは実行すると何にもでてきません
一応、同じカードを引かないように工夫はしたつもりです。
ここって、バグを指摘するスレなの?
6765:03/07/09 21:02
放置でつか?
>>67
ソース読むのメンドクセ
>>65
よーわからんが動いたぞ。
7065:03/07/09 21:12
間違えました。上のプログラムはちゃんと動きます
でも、なんで結果は、a[0],a[1],a[2]が延々とでてしまうんでしょうか
>>70
正直ソースが煩雑で見る気にならない。
山から1枚カードを引く関数 pull_card()
を作ってmainから必要な数だけ呼べ。
そうすればすっきりして、おかしいところもわかるだろ。
>>65
おまえ、www.ioccc.orgに出馬しろ、ぜひ。天然は強い。
>65
ひょっとして、0-nまでの数を、n個の配列に、重複無く・ランダムに
放り込む方法を知らないとか?
本当は頭のいい人なのかもしれない
知るとか知らないとかいうもんか?
ちょっと考えれば思いつくと思うが。
76デフォルトの名無しさん:03/07/09 22:32
∩( ´Α`)質問です

static const int big_tbl[] = {
/*
ウンザリするほど巨大なテーブル
*/
};

static void func(void){
/*
テーブル使ってほにゃらら
*/
}

があった時、ソースが激しく見づらいので、

static void func(void){
/*
テーブル使ってほにゃらら
*/
}

static const int big_tbl[] = {
/*
ウンザリするほど巨大なテーブル
*/
};
という配置のしたいのですが、どうすればいいんでしょうか?
前方参照みたいなことは可能ですか?
乱数の出方によっては、whileが無限ループにならないか?
78デフォルトの名無しさん:03/07/09 22:35
>>76
staticをexternに。
7978:03/07/09 22:37
じゃなくて、staticを消して先頭にstatic const int big_tbl[];
8078:03/07/09 22:37
またまちがった(T_T)
staticを消して先頭にextern const int big_tbl[];
8178:03/07/09 22:41
またまちがった(T_T)
externを消して先頭にstatic const int big_tbl[];
>>80

extern const int big_tbl[];

static void func(void){
/* テーブル使ってほにゃらら */
}

const int big_tbl[] = {
/* ウンザリするほど巨大なテーブル */
};

こんなカンジですか?
ありがとうございます。今環境がありませんが後で試して見ます
8378/80:03/07/09 22:43
>>82
そう。
元のままの方がいいと思うけどね
tableは大きいなら別のファイルにするという手もあるな。
別ファイルにしてインクルード、
もしくは実行時にファイルから読み込み。
>>65
シャッフルアルゴリズム
1. とりあえず順列にでいいから配列に全部の数を詰める。
2. i 番目の要素と別の要素とを入れ替える作業を i = 0 〜 (n-1) まで順番に行う。
3. それを何度か繰り返す。
87デフォルトの名無しさん:03/07/09 23:36
define マクロについて質問です。
既製のソースをそのままで for の条件式の所にだけチェック用の関数を入れたいのですが

#define for(a) for(a)

のようにはできても

#define for(a;b;c) for(a;check(b);c)

のようにはできません(「;」は区切りに使えないみたいです)

置き換え後は別に for じゃなくてもいいので
#define for(a;b;c) {a;while(b){c;}}
とかも考えたのですが、左側部分の問題は残ったままです。

カンマで
#define for(a,b,c) {a;while(b){c;}}
とすると、そもそも現在のソース全てに手を入れなければならずに、
元に戻すのも大変な上、
for(a=0, b=0; a < b; ++a, --a)
みたいに書いてある所はどうしようもなくなってしまいます。
何か方法はないでしょうか?
88デフォルトの名無しさん:03/07/09 23:45
>>87
#define FUNCTIME(f,r) \
{    \
    unsigned long time = GetTickCount();  \
    (r) = (f);  \
    time = GetTickCount() - time;  \
    printf("%s time = %lu[ms]\n",#f,time);   \
}

89デフォルトの名無しさん:03/07/09 23:47
VCじゃデバッグしか使えないから
90デフォルトの名無しさん:03/07/09 23:52
あ、勘違い。
>>87
無理。
>>65
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
  int have[5];
  int opn[52]={0};
  const char mark[4][3]={"▲","■","●","★"};
  const char num[13][3]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
  int i,r;
  srand(time(NULL));
  for(i=0;i<5;i++)
  {
  r=rand()%52;
  if(opn[r]) continue;
  else {opn[r]=1;have[i]=r;}
  }
  for(i=0;i<5;i++) printf("%s%s\n",mark[have[i]/13],num[have[i]%13]);
  return 0;
}
9392:03/07/10 01:17
>>92 間違えた。
if(opn[r]) continue;

if(opn[r]) {i--;continue;}
>>87
awkとかperlで加工しちゃったら?
95デフォルトの名無しさん:03/07/10 02:35
>>94
同意。で、それやるなら「プリプロ後ファイルを」行連結しつつ処理かな。
それでも "for (x;y" なんて意地悪な文字列があるとコケがちなんで、
文字列識別位はしないといかんかも。

>>87
どうしても既成のソースいじれないの?
正規表現置換で for (a; CONDCHKFOR (b); c) とかにしちゃって
チェック外す時に #define CONDCHKFOR なり、
inline static int CONDCHKFOR (int a) { return a; }
で良い気がするんだけど。
>CONDCHKFOR
やぼったい
>>87
#define for(a;b;c) for(a;check(b);c)


for(a;

と展開されるはず

だいたい大して楽になってないじゃないか
98うぇ〜〜〜〜:03/07/10 07:30
#include<stdio.h>

int main()
{
printf("1+2=%d\n",1+2);

return 0;
}
↑これをコンパイルして実行したら
何か一瞬だけ表示されて閉じちゃうんですけど…何ででしょ?
ちなみにVisual C++.net2003使ってます、よろしくお願いしまつm(__)m
100デフォルトの名無しさん:03/07/10 12:10
main でファイルから読み込んでいた文字列を、
関数内で行うようにしたいのですが、うまくいきません。
具体的に、
main(){
char file[]="filename";
 char a[LENGTH], b[..], c[...];
 char str[LENGTHLINE];
 FILE *fp;
 /* a の読み込み */
 if ((fp=fopen(filename, "r"))!=NULL){
  fgets(str, LENGTHLINE, fp);
  sscanf(str, "%s\n", &a);
  fclose(fp)
 }
 /* b の読み込み */
 /* c の読み込み */
 処理
}
101デフォルトの名無しさん:03/07/10 12:11

となっているところを、
main(){
 char file[]="file";
 char a[LENGTH], b[..], c[..];
 read_abc(file, a, b, c);
 処理
}

void read_abc(char *file, char *a, char *b, char *c){
 char str[LENGTHLINE];
 FILE *fp;
 /* a の読み込み */
 if ((fp=fopen(file, "r"))!=NULL){
  fgets(str, LENGTHLINE, fp);
  sscanf(str, "%s\n", &a);
  fclose(fp);
 }
 /* b, c の読み込み */
}
というようにしているのですが、
コンパイルは通っても segmentation Fault になってしまいます。
main で配列サイズを決めていても、read_abc で配列サイズを確保しなくては
ならないのでしょうか?
また、一般的には関数間での文字列の受け渡しはどのようにするのでしょうか。
ご教授お願いいたします。
sscanf(str, "%s\n", &a);
>>99
プログラムが終了すればコマンドプロンプトも閉じられる。
そういう仕様。(at Windows コマンドプロンプト)
つか、スレ違い。

>>101
>sscanf(str, "%s\n", &a);
a はポインタぢゃないのか?
ところでコレ、sscanf の仕様を理解して使っているならいいが、それにしても
無駄だな…
デバッグ出力用のマクロの引数を
printfみたいな、引数の数無制限みたいな感じにしたいんですが

↓現在こんな感じ
#ifdef DEBUG_
#define DEBUGOUAT( _f_ , _v_ ) \
{\
fprintf(stdout,_f_,_v_);\
}\
#else
#define DEBUGOUAT( _f_ , _v_ )
#endif

こうやっても、_v_の所は、一個しか引数かけないです。
どう記述したら、無制限にできるのですか?
>>104
コンパイラが C99 に対応してれば

#ifdef DEBUG_
 #define DEBUGOUAT(...) fprintf(stdout, __VA_ARGS__)
#else
 #define DEBUGOUAT(...)
#endif /* DEBUG_ */

が使えるんだが、そうでなけりゃ関数作るしか。

int debugprintf(const char *form, ...)
{
  va_list p;

  va_start(p, form);
  return vfprintf(stdout, form, p);
}

#ifdef DEBUG_
  #define DEBUGOUAT debugprintf
#else
  #define DEBUGOUAT /* none */
#endif /* DEBUG_ */
>>104
#ifdef DEBUG_
#define DEBUGOUT(params) printf params
#else
#define DEBUGOUT(params)
#endif

DEBUGOUT(("Hoge %s.\n", "hoge"));

で、fprintf は諦める。
stderr とかに出したい場合はそれなりの関数を用意する。
そういや、

((void*)0)(i = 0);

とできて、さらに i = 0 が実行されないというのは、
C++ のみの仕様だっけ?
C89 でもできるなら

#ifdef DEBUG_
#define DEBUGOUT printf
#else
#define DEBUGOUT ((void*)0)
#endif

でいいんだけど。
#define DEBUGOUT 0 ||
で、最適化を期待
何秒間の間に数字の1を何回押したかというプログラムを作りたいのですが
誰か教えて下さい。

何秒間というのはランダムです(5秒〜30秒ぐらいの間)
> 誰か教えて下さい。
何を?
111デフォルトの名無しさん:03/07/10 20:57
malloc関数について教えてください!

mallocが返す値ってポインタですよね。
IBMにあったサンプルプログラムで下記のようなコードがあるんですけど、
TIFFRead~()の3つ目の引数で、ポインタにint型の整数を加えているのがわかりません。
確保した領域がどこにあるのかを示す値に加えちゃたら
どこか変なところを指しちゃったりしないんですか?


char *buffer;
int imageOffset=0;

buffer = (char *) malloc(bufferSize)

for (stripCount = 0; stripCount < stripMax; stripCount++){

if((result = TIFFReadEncodedStrip (image, stripCount,buffer + imageOffset,stripSize)) }
>>109
>>1を読めないような奴に、何を教えても無駄。
>>111
buffer += imageOffset じゃないから大丈夫。
114デフォルトの名無しさん:03/07/10 21:06
質問(C言語)
構造体 name のメンバ変数 strName の値をqsort関数を使い
ソートを行いたい。
どうやれば良いのか教えてください。

typedef struct _Name{
char strName[30] ;
} Name ;

Name name[7] ;

strcpy( name[0].strName, "C" ) ;
strcpy( name[1].strName, "X" ) ;
strcpy( name[2].strName, "B" ) ;
strcpy( name[3].strName, "BB" ) ;
strcpy( name[4].strName, "A" ) ;
strcpy( name[5].strName, "AB" ) ;
strcpy( name[6].strName, "ZX" ) ;
strName をソートすんの?
116デフォルトの名無しさん:03/07/10 21:13
>>115
そうです。
文字列ですが出来ますか??
>>116
本当に?
strName でソートすんじゃないの?
strNameをkeyにしてnameをソート

#include <stdio.h>
#include <string.h>
typedef struct _Name{
char strName[30] ;
} Name ;
int NameCmp(const void *a, const void *b){
return strcmp(((Name*)a)->strName,((Name*)b)->strName);
}
main(){
Name name[7] ;
int i;
strcpy( name[0].strName, "C" ) ;
strcpy( name[1].strName, "X" ) ;
strcpy( name[2].strName, "B" ) ;
strcpy( name[3].strName, "BB" ) ;
strcpy( name[4].strName, "A" ) ;
strcpy( name[5].strName, "AB" ) ;
strcpy( name[6].strName, "ZX" ) ;
qsort(name, 7, sizeof(Name),NameCmp);
for(i =0;i<7;++i)
printf("%s\n",name[i].strName);
}
119デフォルトの名無しさん:03/07/10 21:21
>>117
そうです。
strNameでソートします。
>>99
スレ違いだけどヒント。

int main()
{

(σ゜Д゜)σゲッツ!!
return 0;
}








若しくは、コマンドプロンプト開いて、
プロンプト>実行ファイル名
(σ゜Д゜)σゲッチャー!!だろ
ヒントだからさ。
123デフォルトの名無しさん:03/07/10 21:36
>>113
なるほど。言われてみれば確かにそのとうりですね。
ありがとうございます。

でも、それじゃあ buffer + imageOffset ってどういう処理をしてることになるんでしょうか。
度々すいませんがお願いします。
>>123
buffer先頭からimageOffsetだけポインタをインクリメントした先のポインタを返す。
>>118
ありがとうございます。
126デフォルトの名無しさん:03/07/10 21:47
>>124
なるほど。
よく見れば>>1にも書いてあるのに
丁寧にどうもありがとうございました。
127デフォルトの名無しさん:03/07/10 22:21
うに
128デフォルトの名無しさん:03/07/10 22:31
int型変数、a,b,の値をそれぞれ10,4として、次の文をそれぞれ
実行したときのaの値を表しなさい。
(1) a/=b
(2) a+5*b--
(3) a=a!=b
(4) a=a%b
(5) a=a>b
(6) a=a||b
(7) a++
(8) a=!a
(9) a+=b*2
(10) a=(++a)*(b++)
マルチすんなよボケ
>>128
>>1読めバーカ
(10)は未定義
stderr ってなんだよ

stdinやstdoutは
unko.exe < data.txt
unko.exe > data.txt
で、使えること知ったけどよ。

stderr ってなんだよ
unko.exe > data.txt
とやっても、data.txtに書き出さずに、プロンプトにエラーメッセージを表示できる。
134デフォルトの名無しさん:03/07/10 23:16
>>133

突然、変なこと聞くけど
unko.exe > data.txt
data.txtへリダイレクトしている内容を、Cのプログラムで直接受け取ることは不可能ですか?

int main(int argc, char **args){
unko.exe の出力をこの中でいじる!
}
135マルチでごめん!:03/07/10 23:17
>>134
system("unko.exe > data.txt ");
data.txtを開いて読むというのは無しね。 
どうしたいのかよくわからん。
リダイレクトはファイルへしかできない。
標準出力に出されたものを、標準入力から取り込むならパイプがあるが。
>>133
( ゚∀゚ )なるほど

ありがたい
138134:03/07/10 23:23
>>136
/* wget で取り込んだhtmlファイルをdata.txtという名前で保存する*/
system("wget http://hanyan.co.jp -O data.txt ");
data.txtを開いて読む。
ということをやっていたプログラムをファイルの使えない
組み込みLINUXに移植することになりましたので、よい方法を探しています。

wget の出力を、C言語の中で、charの配列か何かで受け取る方法は無いかなあと。

共有メモリとかあるはずだが。
popen
unko.exe | hoge.exe
142134:03/07/10 23:49
>>140
それだ〜〜〜〜〜っ!
ありがとう。ありがとう。
文字で図形を描こう
繰り返しを使い、三角形を画面に表示させましょう。ただし、表示する三角形の
高さをキーボードから指示するものとします。


高さが n の三角形を表示するには、
1行目ではスペースをn-1回表示し、アステリスクを1回表示
2行目ではスペースをn-2回表示し、アステリスクを3回表示

k行目ではスペースをn-k回表示し、アステリスクを2k-1回表示

という処理をn行目まで繰り返します。


□□□□□□□*↓
□□□□□□***↓
□□□□□*****↓
□□□□*******↓
□□□*********↓
□□***********↓
□*************↓
***************↓


あとは、簡単ですからプログラムを作ってみよう。

応用編
□□□□□□□*↓
□□□□□□*□*↓
□□□□□*□□□*↓
□□□□*□□□□□*↓
□□□*□□□□□□□*↓
□□*□□□□□□□□□*↓
□*□□□□□□□□□□□*↓
***************↓


にチャレンジしてみよう。
145143−144:03/07/11 00:01
よろしくおねがいします。
>>145
自分でやれ!
>>143
しゅくだいは、じぶんでしましょうね。(いちおうひらがなでかいておきます)
>>144
>>1
> ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
>>101
sscanf()のパラメータが間違いだらけ。
受け渡し方としては、まぁいいんでないかい?
尤も、LENGTHとLENGTHLINEの値によっては問題あり。
>>101
・sscanf()のパラメータが間違いだらけ。
・そもそもsscanf()の必然性が不明。
・LENGTHとLENGTHLINEを分ける理由も不明。
・fileもレゾンデートルが不明。
・a,b,cを読むたびにファイルを開きなおすのか? その辺も不明。

「具体的」と書く以上、もっとちゃんと元のソースを載せろよ。
元々おかしいのか、コピーの段階でおかしくなったのか判らないじゃないか。
151 :03/07/11 00:35
LinuxでC言語を使ってMACアドレスを取り出すにはどうするの?
>>143-145
ここまでハッキリとアルゴリズムが示されていて、何がわからないと言うのだろうか?
C。
155デフォルトの名無しさん:03/07/11 02:03
外部シンボル "__imp__timeEndPeriod@4" は未解決です
外部シンボル "__imp__timeBeginPeriod@4" は未解決です

というエラーが出ます。

ちゃんと
#include <mmsystem.h>
をインクルードしてから、
timeBeginPeriod(1);
を使っているのですが
Microsot C/C++ 13.0.9466(VC.NET)
http://www.microsoft.com/japan/msdn/netframework/downloads/



有償?
>>155
それはリンクエラー
ヘッダーファイルをインクルードしたかどうかは関係ない。
158155:03/07/11 02:16
winmm.libをリンクしたらいきました
しかし、なぜMSDNで検索してもtimeEndPeriodは見つかりませんなんだ?
159デフォルトの名無しさん:03/07/11 03:36
正常に動いていたプログラムを2つのファイルに分割しコンパイルしたところ、
次のようなエラーが発生しました。
codemlmain.c が main を含み、codemlwrap.c が関数 codemlwrap を含むファイルです。
read_control_file, get_num_of_trees などは codemlmain 内で定義し、
codemlmain ファイル内からのみ呼び出している関数です。
codemlwrap.c, codemlmain.c 内の関数のプロトタイプは codemlmain.h で
宣言し、codemlmain.c からのみ include しています。
codemlwrap.o: In function `read_control_file':
codemlwrap.o(.text+0x554): multiple definition of `read_control_file'
/tmp/ccIGiNsI.o(.text+0x0): first defined here
/usr/bin/ld: Warning: size of symbol `read_control_file' changed from 897 to 893 in codemlwrap.o
codemlwrap.o: In function `get_num_of_trees':
codemlwrap.o(.text+0x8d4): multiple definition of `get_num_of_trees'
/tmp/ccIGiNsI.o(.text+0x384): first defined here
codemlwrap.o: In function `get_tree':
codemlwrap.o(.text+0x978): multiple definition of `get_tree'
/tmp/ccIGiNsI.o(.text+0x428): first defined here
codemlwrap.o: In function `get_seq':
codemlwrap.o(.text+0xa1c): multiple definition of `get_seq'
/tmp/ccIGiNsI.o(.text+0x4cc): first defined here
codemlwrap.o: In function `print':
codemlwrap.o(.text+0xba4): multiple definition of `print'
/tmp/ccIGiNsI.o(.text+0x654): first defined here
collect2: ld returned 1 exit status

以上、よろしくお願いいたします。
>>159
オブジェクトファイルを二重にリンクしようとしてないか?
makefileなどを見なおしてみるように。
尚、これ以上はスレ違い。
161_:03/07/11 03:48
>>159
1 ファイル内のみでしか使わない(staticな)関数の宣言は
  そのファイルの頭で宣言する(ヘッダファイルを使用しない)
2 ファイル外で使う(externな)関数と変数の宣言は、ヘッダファイルにまとめ
  その関数及び変数を使用する全てのファイルの頭で #include する
3 2で宣言した関数と変数は、全てのファイルの中で
  必ず、1回だけの定義をする必要がある

>>160
別にスレ違いではないような…
>>159
関数プロトタイプを勉強しませう。
>>162
リンク手続きの問題なら、コンパイル環境の使い方になるからスレ違い。
まぁ、あんたの指摘するような問題もあるからその点に関してはスレ違いではないな。
165159:03/07/11 10:03
まだ Makefile とか書いていなくて、
gcc -c codemlwrap.c
gcc -o codemlmain codemlmain.c codemlwrap.o
としているだけなのですが、問題ありますか?
>>162
>>3 2で宣言した関数と変数は、全てのファイルの中で
>>  必ず、1回だけの定義をする必要がある
これは全てのファイルを通して、各関数が1回だけ定義されている必要がある、
ということですよね。

codemlmain.c, codemlwrap.c の両方で #include しましたが同じ結果になります。
んんー、特に問題ない気がするのですが・・・。
166159:03/07/11 10:16
同一ファイル内からしか呼び出さない関数を全て static にしたら
できました。お騒がせしました。
でも、これって static 付けなきゃいけないもんなんですか〜?
>>166
疑問があるなら調べろよ。
staticとは何か理解しているのか?
>>166
ソース晒してみ?
static宣言しなくても普通はコンパイルできるんだがな。
#ヘッダファイルじゃなくてソースをincludeしているに一票。
関係ないけど
gcc -c codemlwrap.c
gcc -c codemlmain.c
gcc -o codemlmain codemlmain.o codemlwrap.o
これと>165のは同じ意味ですか?
だから関数プロトタイプを勉強しろって。
>>170
なんとかの一つ覚え?

>>169
ほぼ同じ。
但し、>>165ではcodemlmain.oが生成されない。
つーのはgccの話であって、コンパイラによっては一概に言えない。
172169:03/07/11 16:27
なるー
Cをはじめて3日目です。
平方根を求めるプログラムを作っているのですが、実行時にエラーになってしまいます。
コンパイル時の警告メッセージも意味がわかりません。

#include<stdio.h>
#include<string.h>
#include<math.h>

/*平方根を求めるプログラム*/
intmain()
{
char*i;
intl;
doublej,k;
for(l=0;l!=EOF;l++)
{
printf("数値を入力してください。\n");
gets(i);
i[strlen(i)-2]=NULL;
j=atof(i);
k=sqrt(j);
printf("平方根は%fです。\n",k);
}
return0;
}
174デフォルトの名無しさん:03/07/11 16:48
>>173
sageているし、ネタだと思っていいのか?
iはどこを指しているの?
>>173
あえて言おう!

> 平方根を求めるプログラムを作っているのですが、

君が作っているのは平方根を求めるプログラムを使うプログラムだ!
gets(i);
i[strlen(i)-2]=NULL;
j=atof(i);

scanf("%d", &j);
>>173
char* i; → char i[128];
i[strlen(i)-2]=NULL; → 不要
>>173
君にはまだ早いような気がします。
179デフォルトの名無しさん:03/07/11 19:41
こんばんわ。
ちょっと質問させてください。

12bitの整数型を使ってmalloc()で領域を確保したいのですが
どうすれば12bitの値を扱えるのでしょうか?
180デフォルトの名無しさん:03/07/11 19:43
>>179
ビットフィールド
int12 *p;
p = malloc(sizeof(int12));
>>179
32ビットで我慢しろ。
C言語にも
http://java.sun.com/j2se/1.4/ja/docs/ja/api/
みたいな関数リファレンスってネットにありますか?
184デフォルトの名無しさん:03/07/11 19:51
>>183
JISに仕様書があるけど、とてもみづらいので、
http://www.bohyoh.com/CandCPP/C/Library/index.html
これで。全てサポートしていないかもしれないけど。
185デフォルトの名無しさん:03/07/11 19:53
swprintfとか載ってねーな
186183:03/07/11 20:05
>>184
今の自分にはこれで十分そうです。
ありがとうございます。
187179:03/07/11 20:10
>>180
ビットフィールドって7bit以上でも使えましたっけ?

>>181
Linux上でgccを使ってるのですが、
コンパイル時にint12で弾かれてしまいます。
どうしたらいいでしょうか。

>>182
12bitは決定で変えられないんです。
>>187
12bitの整数を扱わなければいけないのはなぜ?
何をしようとして必要なんだ?
189179:03/07/11 20:18
>>188
画像処理で使うのですが、
機械の都合でピクセル毎の輝度が12bitで与えられるからです。
C++でclass Int12を作って、それを使うとか。
>>189
演算は32bitで行って、必要なときに12bitにつめればいいんでないの?
>>187
何だかよー分からんが、
例えばフロッピーディスクの FAT のように、
12 ビット長の値の羅列を扱う必要があるって状況なわけね?

12 ビットの型を用意することはできないので、
(ビットフィールドを使っても、
 その構造体のサイズはバイト単位になってしまう)、
8 ビットの配列を使って、
それを 12 ビットの配列であるかのように扱うしかない。

例えば、char a[3]; とすると、CHAR_BIT が 8 だとすると
((int)a[0] << 4) | (a[1] >> 4) と
((int)a[1] & 0x0F) << 8 | a[2] を
第 0, 1 要素として扱うわけだ。
それって12bitしか使わなければいいのでは?
>>189
頭が固い奴は(ry
195デフォルトの名無しさん:03/07/11 20:38
>>187
あれってひとつのメンバーに割り当てられるのは6ビットまでなの?
ビットフィールドじゃ解決にならないってば
>>189
12bitで画像処理ってIKONOS画像か?
算術演算のみでビット演算しないんだったら32bit整数で間に合うと思うけど。
198179:03/07/11 20:44
>>190
C++は全く齧ったことがないのですが、ちょっと調べてみます。

>>191
12bitの値を32bitの型で受けるんですか。
やってみます。

>>192
>12 ビット長の値の羅列を扱う必要があるって状況なわけね?
はい。その通りです。

ちょっと難しそうですが、例に挙げていただいた通りやってみます。

>>193
12bitしか使わなければいいっていうのは
どういうことでしょうか?

>>197
算術演算のみです。32bitで間に合いますか。
ちょっと考えてみます。
>>196
それなら191も駄目ってことになるけど。
具体的にはその12bit整数配列に対してどういう処理が必要になるの?
201200:03/07/11 20:58
12bit のintを使おうとせずに、12bitデータが入ったデータ領域に対して処理をするような関数を作っていったほうがいいと思われ。
202179:03/07/11 21:02
>>200
ここにある処理と同じことがしたいです。
http://www-6.ibm.com/jp/developerworks/linux/020517/j_l-libtiff.html
基本的には、ただ配列から値を取り出せれば問題ないと思うのですが。
12bitなのは輝度だけなの?
204179:03/07/11 21:22
>>203
はい。
他の要素(サイズとか圧縮方式とかメモとか)は
ヘッダーに格納されていて、別の関数で取り出します。
答えになっていないと思う。
>>199
なんでやねん。
ビットフィールドと、ビット演算は違うぞ。

そもそも、ビットフィールドって互換性がぐちゃぐちゃだから、外界とのやり取りにはつかえないし。

(まあ、ビット演算の方もエンディアンの問題が歩けど。)
207179:03/07/11 21:36
>>205
失礼しました。
12bitの配列は輝度だけです。
RGB+1の合計4つの12bit整数で1ピクセルができます。
208デフォルトの名無しさん:03/07/11 21:37
int12arrを12ビット整数の配列のポインタ
idxを取り出したい12ビット整数の配列のインデックス
として、以下の関数でデータを取り出す。
int GetInt12(unsined char* int12arr, int idx)
{
  int int12;
  if (idx%2) {
    int12 = array[3*idx/2]<<4 + array[3*idx/2+1]>>4
  } else {
    int12 = array[3*idx/2+1]<<8)&0x00000f00 + array[3*idx/2+2]
  }
  return int12;
}
速度が気になるならマクロかinline関数にする。
>>202
ソース見せられても困るんだけど。
そうじゃなくてさ、int12の配列に対して具体的に何がしたいのか。

indexで要素を取り出すとか、
指定範囲を取り出すとか、
指定範囲に書き込むとか、
コピーするとか、移動するとか。

そういう風に必要な処理を作って、それらを使って最終的な目的を果たせばいいでしょ。
210209:03/07/11 21:45
おっと、取り出せばいいって言ってるか。
じゃぁ、>>208で解決?
211179:03/07/11 21:56
>>208
サンプルコードまで書いて頂いて、ありがとうございます。
参考にさせて頂いてしっかり身に付けたいと思います。

>>210
はい。解決です。
長々とお騒がせしましてすみませんでした。


レスして頂いた方、ありがとうございました。
とても勉強になりました。
ビット演算してる最中にエンディアンでハマるようなトロいやつはシスプロに向かん
エンディアンの確認を忘れてハマルことはたまにあるな。
>>212
ビット演算してる最中にエンディアンではまるなんてことがあると思ってる奴は、プログラマに向かん。
エンディアンではまるのは、外部とのやり取りか、変なキャストをした時だけだろ。
外部とのやり取りか、変なキャストをするときだけ特別なのか、あんたは
>>215
はぁ ?
それ以外で、エンディアンではまる例をあげてみなよ。
だからハマんねーつってるだろ
とっても恥ずかしーバグ出して欝な香具師同士で傷のなめ合いでもするスレかここは
>>217
なんだ、日本語できないクンだったのか...。

エンディアンではまる (可能性がある) のは、外部とのやり取りか、変なキャストをした時だけだろ。
220kei:03/07/11 23:50
課題1:3科目(英数理)の点数をキーボードから入力して、それらの点数のうち最も高い点数を表示するプログラムを作りなさい。
自分が作ったのは下のです
#include<stdio.h>
main()
{
int eng,math,sci,max;
printf("英語の点数--->");scanf("%d",&eng);
printf("数学の点数--->");scanf("%d",&math);
printf("理科の点数--->");scanf("%d",&sci);
if(eng>math){
if(eng>sci){
max=eng;
}
else{
max=sci;
}
}
else{
if(math>sci){
max=math;
}
else{
max=sci;
}
}
printf("最高点は%d点です\n",max);
}
でもどうやら「関数」構造でなければならないらしいのですが、その時の講義に法事の為出席できなくて関数がわかりません。
本も読んだのですがプロトタイプが必要とかそれくらいしか理解できなかったです。
基礎論なので難しい関数は使わないはずです。void return ansとか本に書いてあります。
他のスレにも書いたんですが、レスないのでお願いします。
>>219
うっせえ、日本語以前にC言語できないクソにタメ口たたかれる憶えはない
いつまでもてめえのスキルを当然だと思っていろヘボ
>>220
その程度なら特に関数はなくても困らないけど、
まぁ関数作るとしたら
3つの値を引数にとって、その中の最大値を返す関数
を作るかな。

int max(int eng, int math, int sci)
{
 /* 中身は自分で考えてちょ */
 return ans;
}
こういうの作って、

printf("最高点は%d点です\n",max(eng, math, sci));
こういうことする。

数学の関数と同じで、関数は引数をとって、結果として値を返す。
その値は数学と同じ様な格好で使う。
printf も scanf も main も関数だし、
それが使えてるなら特に難しいことはないと思う。

あと、main の最後では return 0; を忘れずに。
ちなみに220はマルチです。
>あと、main の最後では return 0; を忘れずに。
voidがない処理系だろ、そんくらい嫁
>>221
> タメ口

彼には、あれがタメ口に聞こえるんだ...。
好意的な解釈する奴だな。(藁
>>225おいエンディアン、反論できないと自作自演かw
で。答えは何なの?
エンディアンではまるやつはバカ
229kei:03/07/12 00:15
ご丁寧にありがとうございます。
せっかく教えていただいたのに答えがわかりません。関数なしのプログラムが僕の精一杯なのかも…
223さん、マルチってどういった意味でしょうか?
224さん、それはどういうことですか?
なんだか聞いてばかりでごめんなさい。お願いします。
エンディアンうそつかない。
ハオハオ
>>223
> 他のスレにも書いたんですが、レスないのでお願いします。
>>224
main() だから戻り値の型は int だろう。
>>225
8〜23行目をコピペして max → ans にして、
int ans; をつければ終わりだよ。
>>232
>main() だから戻り値の型は int だろう。

そうだよ。それを百も承知で国家する場合を知らんらしいな。
国家する?
ねむ。。。漏れもそろそろ国家するぞ
国家とリス
C++ では main の return 0; を省略することは規格で許されている。
C では main の return 0; を省略することは規格で許されていない。
そんな役所気質な...
>>226-228
わかりやすい、自演ありがとう。

で、君は何に反論して欲しいんだ ? (藁
240227:03/07/12 00:59
真実はいかに?俺はどっちでもいいんだけど
>>230で結論出たんだからもういいじゃん。
キャストに変も糞も無いと思うけど?
243kei:03/07/12 01:06
>>232
レス遅くなってすいません。
どうもありがとうございました。
良い人ばかりで嬉しいです。
244199:03/07/12 01:15
あーなんか喧嘩になっとる。。。

>>206
互換性がぐちゃぐちゃ?12bit割り当てたつもりが実際はそれ以上割り当てられることもあるとか?
>>242
はぁ ? 腐るほどあるけどな。
まあ、出会ったことないなら、それに越したことはないよ。

>>244
それに加えて、MSB/LSB のどっちからビットを割り当てるとかがぜんぜん決まってないよ。
>>214 が書いてる通り、キャストや外部とのやり取りしないなら問題ないけどな。
246199:03/07/12 01:32
>>245
この場合はどちらから割り当てるかってのは関係ないと思うけど、「それに加えて」ということは244で言ったことがありえるの!?
247199:03/07/12 01:35
あー、関係ないと言ったのは例えばbitfield.member=12345;とやった時(12345を受けるだけの大きさを持っている)、
ビットパターンがどうであろうとbitfield.memberの値は12345でしょ?ということ。
>>242
int a = 0xFF000000;

*(char*)&a はなーんだ?
>>245
あんた、何の為にキャストすんの?
ある型を無理矢理、他の型に変換する為に必要だからじゃないの?
それとも、何か他に笑えるキャストがあるとでも?
くだらん! おまえのはなしはくだらん!
>>248
int a=1;にしろよ。0xFF...が入らないという問題も起こりうるだろ。
くだらない事で議論するな。この、方形ヤロウども!!
例えば、速度重視の場合でアライメントが16bitだったとしよう、
で数パターンしかない情報が3つと、フラグが1つの情報が絶対に必要。
そうしたら、普通は1-5-5-5bitで16bit内に情報を詰めると思うんだけど?
勿論キャストなんてしないしですが、エンディアンとやらは問題になりませんか?
値セットや値を取り出すとき。<<>>
>>251
これって、ソフト的なエンディアン判定に使えるんだよな。
>>253
最後の<<>>はなんですの?
>>253
[0] [1]
とデータが入っていると、

リトルエンディアンの場合
[1] << 8 + [0]
が 16 ビット値になる。

ビッグエンディアンの場合
[0] << 8 + [1]
が 16 ビット値になる。
>>253
ならない
が、通常、そのデータを外部に保存する必要がある為
その時にエンディアンが問題となる

>>255
シフトでしょ
>>256
それだと、セット時に値を壊さないか?
x <<>> = 6; とか出来たらちょっと便利かも。
>>258
どの値が壊れるの?
>>257
まったくもって訳わからんよ?
何故、値を保持する目的のデータを外部に
ま・た・保持しなおすの?

よっぽど外部以外の事にしたくなんだね。
>>259
どう言う値が入ると便利だと思ってるの?
>>262
上位nビットをクリアするときとか。
nが変数のとき

x <<>> = n; で上位 n bitクリアできる。

ようするに
x <<= n;
x >>=n;

エンディアンのことは何にも考えてないので突っ込まないでね。
>>261
>>253が言ってる事は
typedef short i16 ; /* short は16bit */
typedef struct { char flag ; char data[3] ; } info ;
これを、キャストを使わずにシフトとビット演算のみで
infoの値をi16にセットしたりi16からinfoの値を取り出す事で
エンディアンとは全く関係ない
>>264
要するにその構造体をパックしたいの?
>>263
&= 使え。
>>263
関係あるのはエンディアンでは無く算術シフトやね
268264:03/07/12 02:29
>>265
>>253の説明から、それ以外、どのように解釈すれば良いと?
>>264
で、リトルエンディアンとビッグエンディアンで
同じコードで問題無いの?
どっちにシフトするの?
って話じゃないの?
>>268
あ、俺は261じゃないよ。ずっと見ているだけだった。
もしそうならエンディアンは関係ないなぁ。
関係あるのはファイルに書き出すときと読み出すときだな。
>>269
int i = 257 >> 1 ;
この結果がエンディアンで変わるとでも?
>>270
メモリでもエンディアンは問題になるが?
>>272
ファイルからの読み出し時と書き出し時にバイトオーダーを統一する処理をするだろ?
>>274
はぁ?
Bit処理って書いてあるだろ?
>>267
こうだ!

x &= ~0 >> n;

俺って頭いい〜。
276275:03/07/12 02:39
アンカー間違えました
>>266でつ
今日は、とても芳ばしい香具師がいるようで…
278273:03/07/12 02:39
ネットワークでのhtonlやntohlみたいに。
>>275
x &= ~0u >> n;

符号ありで符号が残されるかどうかは未定義だけど、
符号なしなら符号ビットは残されない...よね?
>>279
うん
>>279
xを符号なしにキャストすれば
~0uも符号無しの演算になると思う…
で、リトルエンディアンとビックエンディアンで
bit = 1;//ビットのつもり
bit << 6;//6ビット目
valure | bit;//セット
見たくセットして問題ないの?
例えば、マスク処理とかで
valure & 0xf0;//上位ビットが欲しい
なんて場合でも?
283281:03/07/12 02:48
良く考えたら、やっぱり、駄目やね…
>>282
そういうのは問題ない。
>>282
>bit << 6; /* 6ビット目と言う表現は別にして */
問題ない
ただし、ファイルから読み込む時、ファイルに吐き出す時は要注意
>>282
キャストがなければ大丈夫。
intをキャストでcharに分割したときとか、その逆とかで問題が起きる。
0xf0でマスク取ってるのは問題にならないの?
288285:03/07/12 02:55
>ただし、ファイルから読み込む時、ファイルに吐き出す時は要注意
は、この場合、全く関係無かったから、無視してちょ
>>287
対象のエンディアンが変われば、マスクのエンディアンだってかわるっしょ。
>>289
だから
valure & 0xf0; /* 上位はエンディアンに関係なく上位だ */
エンディアンを考慮しなければならない時は
(異なるエンディアンの)ファイルをバイト単位で読み込んで
そのまま、何もせずに、マスク処理をほどこす時
そりゃ違うフォーマットのデータだものな。
>>290
突っ込む相手を間違えてるぞ。
293290:03/07/12 03:09
>>292
書き込んだ直後に気付いたけど
>>287の答えとしては、少し不適切だから
そのままでも良いかと思わなくもなかったり…
まぁね。
295教えてください:03/07/12 08:05
/*InputTest.cpp*/

#include <stdio.h>
#include <string.h>
#include <conio.h>

char *ary[1000];
void test();
void main()
{
test();
printf("\n\n");
}

void test() {
char c;
int i=0;
do{
printf("\nEnter string: ");
char s[256];
ary[i] = gets( s );
printf("You typed: %s", ary[i] );
i++;
printf("\n\t****Press any key to continue or quit to press (q)**** ");
c = getch();
}while( c != 'q' );
printf("\nHere:\n");
for( int j=0; j < i; j++ )
printf("\n%s", ary[j] );
}
296295:03/07/12 08:09
上記のコードだと全て、最後のインプットのみになってしまいます。
本来なら、
dog
cat
bird
となるはずですが、どなたか原因が分る方教えてください。

Enter string: dog
You typed: dog
****Press any key to continue or quit to press (q)****
Enter string: cat
You typed: cat
****Press any key to continue or quit to press (q)****
Enter string: bird
You typed: bird
****Press any key to continue or quit to press (q)****
Here:

bird
bird
bird

Press any key to continue
297295:03/07/12 08:11
補足です。本来なら
dog
cat
bird
となるはずなのに、
bird
bird
bird
となってしまいます。なぜでしょうか?どなたか原因が分りますか?
298_:03/07/12 08:16
>>295
ポインタを理解してください。
300デフォルトの名無しさん:03/07/12 08:17
>>297
s[256]はループするたびに書き換わる。
aryにはその領域へのポインタしか入れないんだから、常に最後に入力したものが表示されて当然。
301:03/07/12 08:24
>>300
ありがとうございます。早速
char s[256];
をループの前、にもっていきましたが、結果はおなじでした。
そのあと、グローバル・バリアブルにしましたが、やはり、
結果は同じでした。
302297:03/07/12 08:26
でも>>300さん、応えてくださって感謝します。
>>301
なぜそんな事する?
304297:03/07/12 08:30
>>303
ポインタに慣れていないので、今の自分にはそれが精一杯です。
しかし、charのポインタのアレーを使うことが条件なのです。
305300:03/07/12 08:33
>>301
要するに>>299
ポインタ配列に入れた値は全てsを指しているからそうなるの。
306297:03/07/12 08:38
>>305
要するに配列のインデックスをインクリメントしても、全てのインデックス
を指してしまうのでしょうか? インデックスごとに違うものをさすことは
不可能なのでしょうか?
307300:03/07/12 08:41
>>306
sを二次元配列にするなどして、ループするごとに違う領域に書き込むようにすればよい。
今のままでは大勢で一人を指さしているようなもの。
ary[i] = gets( s );

ary[i] = strdup(gets( s ));
にでもしろ。

>しかし、charのポインタのアレーを使うことが条件なのです。
宿題なら余所いけ。
309297:03/07/12 08:43
>>305
char *c[] = {"dog", "cat", "bird" };
for( int i=0; i < 3; i++ )
printf("%s", c[i] );

このようにテストした時は、ちゃんと大丈夫だったのに。
どうすれば、キーボードのインプットをそれぞれのインデックスに
アサインできるのでしょうか?
310297:03/07/12 08:53
>>308
ありがとうございます。strdup というファンクションは私の5冊の本の
いずれにもでてないので、知りませんでした。感謝します。

>>307
ありがとうございます。2D配列を使いたいのですが、ポインタの練習
なので、それはだめとのことです。Javaのように簡単ではないですね。
ことでそ。
311300:03/07/12 08:54
ところで、>>295でコンパイルが通るということはC++としてコンパイルしているんだな。
それと、よく見たらs[]ってブロックを抜けているじゃない・・・
たまたまデータが消えずに残っていたんだな。
>ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
313300:03/07/12 08:57
あれ?ブロックを抜けた後じゃなくて関数から抜けたあとだっけ?
自動変数が消滅するのは。
>>313
ブロックでしょ、
たまたま、毎回同じ所に確保されてるっだけかと。
315297:03/07/12 09:00
>>311
>それと、よく見たらs[]ってブロックを抜けているじゃない・・・
すみません、この意味をおしえてください。

>>312
今回は知らなかったけど、次からそうします。
316300:03/07/12 09:09
>>315
ブロック(ここではdoの)を抜けた後にブロック内で定義した自動変数sを、ブロックを抜けたあとにポインタを介してアクセスしてもいいのかどうかと・・・・
勘違いしていることがあるかもしれないので自信ない。
朝っぱらから書き込み激しいな
318300:03/07/12 09:11
少なくともsという名前にはアクセスできないけど、その領域はどうだったかなぁと。
>>314さんはブロックを抜ければその領域は不安定なものになると言っているけど。そうなるのは関数を抜けたあとかもしれないので。
厨房キター!
延髄反射で質問を返してきまふ。
延髄かよ
321297:03/07/12 09:15
>>316
sはループの中のみと思ったので、ポインタが絡むとそこまで気を
つかわなければいけないんですね。ありがとうございました。

>>317
こちらは今、金曜午後8時です。
とりあえず解法としては
sを2次元にしてary[i]=s[i];とするかmallocしかないと思うのだがどうか?
dog,cat,birdしか入力されないとわかってるならほかにもあるが。
323300:03/07/12 09:16
>>319
申し訳ない。
こんなこと考えたこともなかったもので。自動変数のアドレスを返すというのは考えたことがあるんだけど。
>>310
ANSI Cにstrdupはないから
325300:03/07/12 09:22
イメージとしてはループするたびs[]をつくるんだから、毎回消えるとも言えるか。
じゃあ>>314さんの言うとおりでいいのか。
つまりだ、>>295はスレ違いの質問をしているわけだ、と。
>>299-324は釣られてしまった、と。
阿呆な回答なんかしてるんじゃね、と。

>>295
宿題丸投げなら宿題スレへ行け、と。
C++の質問したいならC++スレで叩かれろ、と。
Cで書きたいならはじめからファイル名が間違っているぞ、と。
327デフォルトの名無しさん:03/07/12 11:05
HP-UX11iのHP Cですが、oracle9.2.0のライブラリをリンクしたCプログラムで
dirname()関数の動作が異なってしまいます。

cc -o test1 -L/oracle/app/oracle/product/9.2.0/lib32/ -lclntsh test1.c

通常は、dirname()の引数で指定してパス名文字列が書き換わることはないですが、
上のコマンドラインでclntshをリンクした場合、dirname()の引数に指定したパス名
文字列からファイル名が削除されてしまいます。
(dirname()のリターン値が示す文字列と同じになる)

何かご存知ないですか?
>>327
>何かご存知ないですか?

知ってる。しかしスレ違いなので書かない。
329327:03/07/12 14:11
>>328
HP板に逝くべきでしょうか?

米オークションサイトのeBayのツールを日本語化しています。
Resource Hackerで日本語に置き換えているのですが文字化けが発生してしまいます。
日本語化のサイトを見て回ったのですがこのソフトのタイプの対応例が無く、
どのリソースの始めの部分にも

STRINGTABLE
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US

が書いてあったので検索しました所、
かろうじて英語で表示しろという命令らしい?事がわかりました。
fontの指定するリソースが無いので上記の文章で
英語として表示させている?と思うのですが、
これをどのように置き換えれば日本語が表示されますでしょうか?
どなたかお教えいただければ幸いです。
>>330
>>1
スレ違い
C++マンセー
C++はウンコカス
333に反応するやつはさらにカス
>>334
自分のことか?w
336デフォルトの名無しさん:03/07/12 19:25
一通りCの基本はできるようになったんですが、
次に何をしようか悩んでます。
APIの使い方を覚える?
それとも、SDKでも覚えてWinアプリ作成?
>>336
スレ違い
>>1読め
338デフォルトの名無しさん:03/07/12 20:01
339デフォルトの名無しさん:03/07/12 20:02
>>338
それはネタか?
340デフォルトの名無しさん:03/07/12 20:09
TCHARとはなんでしょうか?
先生
342デフォルトの名無しさん:03/07/12 22:49
関数の中に関数を作る方法を教えてください。
343デフォルトの名無しさん:03/07/12 22:58
>>336
SDKに1票
>>342
C はやめて、Pascal 使え。
>>343
わざと吊られたんだろ?そうだよな?そうだと言ってくれー!
346デフォルトの名無しさん:03/07/12 23:05
>>340
これです。
#ifdef UNICODE
typedef WCHAR TCHAR , *PTCHAR ;
#else
typedef char TCHAR , *PTCHAR ;
#endif

charやWCHARでなくてTCHARを使っていれば、文字コードが
ワイドキャラクタ環境でもマルチバイト環境でもソースの変更
の必要性がなくなる。

はなっからワイドキャラクタ(=UNICODE)を想定してなければ
charで十分。

347デフォルトの名無しさん:03/07/12 23:10
初歩的な質問なのですが、gccのオプションの-cってどんな意味があるんでしょうか?
>>347
マニュアルに書いてあるだろ?
>>342
C++ なら工夫すれば作れるんだけどなぁ。
ローカルクラスの static メンバ関数にすれば。
350デフォルトの名無しさん:03/07/12 23:13
>>348
コンパイルのみでリンクしないと書いてあるのですが、
リンクしないという意味がよくわからなくて。。。
同じこと考えてる奴がもう一人いたか。。
352デフォルトの名無しさん:03/07/12 23:14
>>347
オプション -o はなんですか?これがヒント。
353デフォルトの名無しさん:03/07/12 23:16
>>350
オブジェクトファイルをつくって終わり?
354デフォルトの名無しさん:03/07/12 23:18
もうちょいヒントをください
>>354
とりあえず本でも買って読めよ、
金が無いなら図書館に行けばあるだろう。
大抵の本に書いてある。

こんな事くらいで聞いてるくらいじゃ、この先ずっと聞きっぱなしか?
>>354
ここは初心者質問スレじゃねーんだよ、かえれ!
357デフォルトの名無しさん:03/07/12 23:25
>>354
a.c -> a.o
b.c -> b.o
a.o+b.o+etc -> a.out
上2行がコンパイルで最下行がリンクです。
358デフォルトの名無しさん:03/07/12 23:27
>>354
なぜこんなオプションがあるかというと。
たとえばオブジェクトライブラリを作るときに便利だからです。
359340:03/07/12 23:31
>>346
ありがとう
どこのヘッダーにその定義があるのでしょうか?
windows.hかな?
360343:03/07/12 23:36
>>345
いえ、わざとではありません。
釣られてもないです
361346:03/07/12 23:36
>>346, 359
windef.hかな?
>>359
tchar.h
>>351 誰の事よ
364デフォルトの名無しさん:03/07/13 00:24
>>349
はぁ ? もうちょっと具体的に書いてくれると、もっと笑えると思う。
これじゃあかんのか?
void f()
{
 struct Inner {
  static void foo() {
   std::cout << "foo()" << std::endl;
  }
 };
 Inner::foo();
}
>>364 >>365
スレタイみれ。
>>366
そんなことは分かってるし。
>>367
そんなことは分かってるし。 
369デフォルトの名無しさん:03/07/13 00:42
つまらん質問ですがおまいら聞いてください。
"C" はなんで "C言語" と言うのでしょうか!?

Fortran COBOL Pascal BASIC

"言語" ってつけるとなんか変に聞こえるんだけど。
石田先生の訳に準拠
以上
371369:03/07/13 00:51
>>370 ガーン そんだけですか。ガックシ
俺は C と呼ぶことにしているがな。
>>372
えっち
>>369
漏れもCダケで通じるときはCだぞ。
逆に他の言語も後ろに言語って付けることがないとは言えないな〜。
375369:03/07/13 01:05
みなさん

 すぃ〜

ですか。よかった。なんか周りが "しーげんご" という人ばっかりで。
( "しー" じゃないですよね… )
>>369
もう少し C 言語の歴史を勉強シレ!
でも、イパーン人に対してだけは C 言語って使うな。
C だけだと通じないことが多いだろうし。
378369:03/07/13 01:12
>>376
へへぇ〜!
顔あらっておととい来ます。

みなさんどもでした!
379よし@C++:03/07/13 01:47
英語・国語・数学の点数を入力して、それらの点数のうち、どれか一つでも90点以上であれば“合格”、
または平均点が60点以上であれば“合格”と表示するプログラムを、関数構造を使って作成せよ。
という課題がでたんですが、正直全然わかりません。基礎論の授業の前期テストなんでホントは簡単なはずなんですが…
勉強がたりなかったようです(:_;) どなたか教えていただけませんか?
380デフォルトの名無しさん:03/07/13 01:47
C++かこっちか迷いましたがここに書きます

func().a;

こういう風にできるらしい
びくーりしたーよ
381デフォルトの名無しさん:03/07/13 01:48
>>379
(・∀・)C/C++の宿題やらせてください。ver10
http://pc2.2ch.net/test/read.cgi/tech/1057070174/
>>379
名前から見ると C++ の質問か?
C++ はスレ違いだぞ。
まぁ、確かにそれは C で十分なわけだが。
そういや、何か上のほうでもちょっと違うけど似たような質問があったなぁ。

点数を入力する関数、
どれか1つでもある点数以上であれば真を、さもなくば偽を返す関数、
平均点を返す関数、
の3つを作ればそれでええんでないかな(main 除く)。

>>380
C++ なら普通に使う。
まぁ、最初は違和感があるやもしれん。
俺もそうだった。
>>380
これは何を表してるのでしょうか?
384よし@C++:03/07/13 02:03
>>382
スレ違い申し訳ありません。失礼しました。
CとC++の違いも分からないような素人なので。以後気をつけます。
>>383
点が見えずらいかもしれんが、
こんな感じ

struct AAA func();

で、構造体AAAがfuncから帰ってきたから、AAAのメンバにアクセスすると
C++だけどね
>>383
戻り値が構造体なら
そういう風に使うこともあるってことさ。
*func();
こうやって戻り値を間接参照するってのもあまりやらないな。
非 const な参照返しなら func() = 0; てなことも。
まるで関数に代入しているよう。
C++ なら
func()->foo(); ってこともするけどな。
>>388
スレち(ry
>>390
違いを見分けられる男なんですね。
参照なんてCにはないじゃん
393デフォルトの名無しさん:03/07/13 08:03
>>336
やっぱSDK!
394デフォルトの名無しさん:03/07/13 08:14
#ifndefと
#if !definedって
何が違うんでしょうか?
親切な方教えていただければ幸いです。
Cだと構造体へのポインタを返して
func()->a
の方が多いかな?
でも、
func().a
も小さい構造体や共用体を返すときには使うよ。
396デフォルトの名無しさん:03/07/13 08:28
MFCとSDKって何が違うんですか?
普通Windowsアプリを作るときはどちらを使いますか?
言語はどれを使ったらいいんですか?
>>394
歴史の違いもあるけど、
#if defined(MACRO1) && defined(MACRO2)
って使い方ができるようになった。
#ifdef/#ifndef
だけだとこういうことはできない。
>>396
スレ違い。
399デフォルトの名無しさん:03/07/13 08:38
>>394
同じじゃないの?
400399:03/07/13 08:40
>>397
そうだったのか・・・ Σ(゚Д゚;
漏れの勉強不足でした・・・
>>397
&&なら
#ifdef MACRO1
#ifdef MACRO2
〜〜〜
#endif
#endif
これでできると思うけど。
402_:03/07/13 08:52
403394:03/07/13 09:07
>>397
>>401
すっきりしました
ありがとうございます
|| だとちょっとね。
405デフォルトの名無しさん:03/07/13 13:30
0〜100までの数をランダムで取得して、
それを表示したいんですが、どうやって乱数を
発生させたらいいですか?
>>405
こんな所で聞くより、googleで検索すれば瞬時に分かるんだが。
>>405
rand()
>>394
#elif の場合は、
#elifdef, #elifndef ってのがないから、
defined ってのがどうしても必要になる。
409デフォルトの名無しさん:03/07/13 13:39
int a=rand(1^100);
printf("%d",a);
410デフォルトの名無しさん:03/07/13 13:47
>>409
( ´_ゝ`)プッ
なぜ俺はこんなに天才なんですか?
>>409
srand()もコールしる!
そんなこともわからないようじゃ天才とは言えんな
414デフォルトの名無しさん:03/07/13 14:12
>>413
ここが2chだと言う事を忘れるな。

天才→天災
415デフォルトの名無しさん:03/07/13 14:40
WinMainが未解決ってどういうことですか?
>>415
問題が山積ということです。
迷宮入り
>>404
とりあえず、
#ifdef MACRO1
#define MACRO1OR2
#endif
#ifdef MACRO2
#define MACRO1OR2
#endif
#ifdef MACRO1OR2
〜〜〜
#endif
ぐらいか。

>>408
ネストすればいいだけだろ。
#ifdef xxx
〜〜〜
#else
#ifdef yyy
〜〜〜
#else
〜〜〜
#endif
#endif

>>413-414
下らん餌に食いつくなよ。
大学の参考書だけでは足りないので、本屋で違ったのを買おうと思って
いるのですが、どの参考書がいいでしょうか?
この参考書を使っているがいいというのがあれば教えてください。
>>415
WinMainを記述してないと言う事。ウインドウズアプリではWinMainが必要。
逆にコンソールアプリではMainが必要。
http://pc2.2ch.net/test/read.cgi/tech/1056280510/l50
で聞くといいよ。
Mainと書いたらコンパイルエラーがでますた。
>>419
足りないところを補う本。
感じない日々を補うための映画ならば泣けるのに
424419:03/07/13 14:56
>>422
そういった名前の本があるのですか?
>>421
そんなコンパイラは捨てろ。
普通は、リンクエラーだ。
なぜ俺はこんなに最強なんですか?
427デフォルトの名無しさん:03/07/13 17:12
すんません、簡単な質問なんですけど
現在コンパイラはccを使ってます。
一般的にccとgccってどっちが早いんでしょう?
どっちのほうが使ってる人多いんでしょうか?
ネットで検索かけてもよくわかりませんでしたので
どなたか教えてください
cc はコマンド名。
Solaris だったら Sun C Compiler だろうし、
他のハード/OS なら gcc の別名かもしれない。
cc はユーザーフロントエンドだっけ?
ccはgccを呼んでいるから、直接gccを呼んだほうが早いんちゃう?
430479:03/07/13 17:16
単なるエイリアスか。
ならいっしょかな。
431479:03/07/13 17:18
>>427
ちなみに使っているのが多いのはgccだろうな。
>>428の理由で ccが動く処理系よりもgccの動く処理系のほうが多いから。
432427:03/07/13 17:21
みなさんレスありがとうございます。
これからはgccを使っていこうと思います。
エイリアスというかシンボリックリンク。
なぜ俺はこんなに最狂なんですか?
printfの魅力にとりつかれたから
たまには保守しとこ。落ちたらいやだし。
>>427
質問が不正確だぞ
プログラミングでは「早い」と「速い」を使い分けろ
それから翻訳速度と実行速度のどっちを問うているのかも
いいか、『ものすごく』重要だ
おまえがそもそもプログラミングを学ぶこと自体の意義にかかわることだ

人が多いかどうかはゲスな問題だ
おまえは世の中の何の役に立ちたいんだ?
もしかして、究極に残酷な問題が根底にあるかも知れんぞ
キモイ
コワイ
てか、無茶なことを言っている >>429 への
ツコーミは禁止なんですか?
スレ違いだから禁止
究極に残酷な問題が根底にあるから禁止
443デフォルトの名無しさん:03/07/13 23:51
LPDWORDって、unsigned long*
だったんですか?
int型のポインタ渡そうとしたら起こられましたけど
444デフォルトの名無しさん:03/07/13 23:53
>>443
スレ違い。

名前からしてポインタ
unsigned long far*
とみた
>>444
windowsスレのほうですか?
お邪魔しました
447デフォルトの名無しさん:03/07/14 00:11
環境依存質問なんですが、cygwin + g++ 3.2 で
malloc で 1420 バイトまでしか確保できないんです。
それ以上確保しようとすると Segmentation fault します。
(C++ の) new char[] でも同様で例外さえ投げずにコア吐きます。
そこまでにヒープを明示的に使っている個所はなく、
メモリが足りないとは思えません。また malloc やメモリアロケータを
置き換えたりもしていません。
何故こんな事になってしまっているのでしょうか?
448444:03/07/14 00:11
int型の"ポインタ"と言っているな。見間違えた。見当違いなレスをしてしまった。
>>447
mallocを呼ぶとセグメンテーション違反?
信じられないな・・・
450447:03/07/14 00:14
環境を書くのを忘れていました。
80486でメモリは1Mです。
451447:03/07/14 00:14
追記です。
malloc(1420) の直後に
malloc(1) としても駄目です。
はじめから
malloc(1421) でも駄目です。
挙動としてはメモリ不足にも見えなくはないんですが
それなら 0 が返ってきますよね?
>>451
malloc(1421)とだけ書いたコードでもそうなるの?
453447:03/07/14 00:17
>>450
それなら理由もわかるんですが…。
本当は 8086 で 640k ですた!

なんちゃって、本当は P4 で 1024M です。
>>447
実際にエラーを起こす、出来るだけ簡単なコードを晒してみそ
455447:03/07/14 00:19
>>452
はい、>>451 で書いた感じになります。
1420 単体は OK で、はじめからそれ以上でも、
その後に追加でも NG です。
#include <stdlib.h>
int main()
{
malloc(1421);
return 0;
}

これだけでセグメンテーション違反・・・・やっぱり信じられない。
バッファーオーバーなんとやら?
どっかでメモリをおかしな状況にしてるとか?
>>456
ちゃうやろ
そこまでにとかいているから、他の処理部分もあるんやろ?
でなきゃやってられねーぜアニキ
459452:03/07/14 00:25
>>458
452の質問に「はい」と答えているから・・・
>>447
レッツ再起動
461447:03/07/14 00:28
>>454
晒そうと思って簡単なコードを書こうと思い、 >>456 さんの書いたコードと同じ物で試したら大丈夫でした。
というかバリバリ平気で 10メガくらい普通に確保できてるみたいです。

でよく考えたら stdlib.h インクルードして中田のですが、
恐ろしいことに windows.h に宣言が入っているみたい…
大丈夫だった時はライブラリを指定しなかったのですが、
これはリンクしてるライブラリを疑うべき状況でしょうか?
そういえばうちの環境だとwhile(malloc(1))とやるとそのうちkillされるな。
NULLが返る前に。
gcc のコンパイルに失敗してたり?
>>461
なら確保した領域の扱い方に問題がある可能性が高い。
きっとどこかでうっかりミスしていると思うよ。
>>461
君の全く別の部分のコードを疑うべき!!
多分変なところのメモリを書き換えちゃってる。
>>447
gccなら↓にチャレンジ♪

#include <stdlib.h>
int main()
{
int i=1421;
char buf[i];
return 0;
}
なぜ書き込みがない?
468447:03/07/14 00:50
>>464
まだヒープから確保したものを使ってないんです。

そろそろスレ変えるべきかもと思いました。
こちらの説明にもだいぶ Windows SDK 色がでてきたので…。

>>456 さんの指摘する通りのメモリ破壊の可能性を探ってみて
その可能性もないと判断できたら Windows API系のスレに再度質問しようと思います。
みなさんありがとうございました。
>>468
WinのAPIじゃなくてgccのスレの方が良いと思うが…
ハゲ同
この場合、APIは関係ない
471447:03/07/14 00:59
>>469-470
そうみたい…。
問題があると思っていたDIB取り扱い部分を切り離して
メッセージループ付近で
単純に1メガ確保→直後に解放
のコードを書いただけで駄目だったっぽいです…。
gcc のライブラリってヒープ足りなくなったらって自動的に OS から追加確保してくれないんですっけ?
>>471
自動的にヒープを追加してくれる OS の存在を、私は知らない。
473472:03/07/14 01:03
って、ちょっと話の内容を勘違いしたかも。
(・д・)
Cってまだ現役なんだなあ...とこのスレ見て感動
ダマレコゾウ >(・д・,,)
関数の最後で、よくポインタ変数をインクリメントしているのを見るんですが
これはいったいどんな役割があるんですか?
>>476
具体例を挙げてみてくれ。
478476:03/07/14 18:47
void sample(char **x, int *k, int n)
{
while(n-- >0){
switch(**x){
case '0':
sscanf(*x+1, "%o", k);
break;
case 'x':
sscanf(*x+1, "%x", k);
default:
sscanf(*x, "%d", k);
break;
}
x++;
k++;
}
}

xはmainで読み込んだ文字列。
nは読み込んだ文字列の数です。

文字列の先頭の文字によって読み込む進数を変えるプログラムです。
479476:03/07/14 18:49
スペースがちゃんと適用されてない・・・見えづらくてすいません。
しかもsage忘れた(;´Д`)
>>479
関数の最後ではないではないか。
ループをひとつ回る毎にxとkを進めてるだけで、
つまりは次の文字列(x)とその文字列の数(n)を処理するようにしてるってことだ。
>>478
ループカウンタを用意してやった方が分かりやすいと思うがなぁ。

void sample(char **x, int *k, int n)
{
 int i;
 for(i = 0; i < n; ++i) {
  switch(x[i][0]) {
  case '0':
   sscanf(&x[i][1], "%o", &k[i]);
   break;
  case 'x':
   sscanf(&x[i][1], "%x", &k[i]);
   break;
  default:
   sscanf(x[i], "%d", &k[i]);
   break;
  }
 }
}
void sample(char **x, int *k, int n)
{
 int i;
 for(i = 0; i < n; ++i) {
  switch(x[i][0]) {
  case 'x':
   k[i] = strtol(&x[i][1], NULL, 16);
   break;
  default:
   k[i] = strtol(x[i], NULL, 0);
   break;
  }
 }
}
483476:03/07/14 20:06
>>480-482
いろいろなアドバイス、どうもありがとうございましった!!
while(n-- >0){
これってwhile(n--){でいいよね。
よくない。
nはintだから負の場合もある
>>485
なんで?nの初期値が負だった場合に違いが出るから?
488487:03/07/14 20:42
やっぱり・・・
「読み込んだ文字列の数」なのに負の数を渡す方が悪いと思うけど・・・
カウンターコードというやつじゃよ。
>>488
例えば君が仕事として関数を作り、それをDLLとして提供したとしよう。
たまたま実行中に引き数が負になる状況が発生したら、
そんな暢気なことは言えなくなるのだよ。
wihle(1)
{
printf("あれれ・・・止まんないよー\n");
}
>>484
if(n>0)
 while(n--){
たまたま実行中に末尾に'\0'のつかない配列をstrlenに渡したり、書き換え不能な領域をstrcatの第一引数にする状況が発生したら、
そんな暢気なことは言えなくなるのだよ。
たいしてコード量が増えないなら、安全側にプログラムするのは職業プログラマなら常識。
>>493 みたいなこという奴はおこちゃま。
>>478
%oと%xに対応するのはunsigned int *
>>494
自分が増やしたコード量を認識してないらしいな
なんせ「常識」つーくらいの常習者

STOPダイアログやSegmentation Faultとの重複コード書いて何やってんの?
>>496
> STOPダイアログやSegmentation Faultとの重複コード書いて何やってんの?

日本語に訳してくれ。
498493:03/07/14 22:34
496は俺じゃないからな・・・
安全を云々言うならunsigned intにするが。
>たまたま実行中に引き数が負になる状況が発生したら、

だいいち責任範囲というものがまるでわかってない
他社製品のバグが出たときの対応まで保証してられるか
500
だいいち人生はトラップだらけということがまるでわかってない
と言うか責任範囲とかにすりかえてる点で、既に使えない奴の烙印は押されてるよ。
だいいち人生の主人公は自分だけということがまるでわかってない
504デフォルトの名無しさん:03/07/14 23:25
int i[]={0,1,2,3,4,5,6,7,8,9};
これがOKで、

int i[][]={
{0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8},
{10,11,12,13,14,15,16,17,18}
};
これはダメ、、どうして?
>>504
配列の要素の大きさが分からないから。
int i[][N]ならOK(Nは定数)
>>504
仕様です。
規格博士に質問です

malloc()で割り当てられた(NULLでない)ポインタpを
remalloc()に渡し、メモリの再割り当てに失敗した(NULLが返ってきた)時は
元の領域は、解放されるんでしょうか?
それとも、領域は残っているのでしょうか?

また、fopen()で開いたストリームの(NULLでない)ポインタfpを
freopen()に渡し、ストリームを開くのに失敗した(NULLが返ってきた)時は
元のストリームは、閉じているのでしょうか?
それとも、開いたままなのでしょうか?

自分で同様の関数を書けば関係ないと言われそうですが
規格上で、どうなってるのかを知りたいので宜しくお願いします
508507 訂正:03/07/15 03:00
× remalloc()に渡し、メモリの再割り当てに失敗した(NULLが返ってきた)時は
○ realloc()に渡し、メモリの再割り当てに失敗した(NULLが返ってきた)時は
>>507
規格博士じゃないが。

s/remalloc/realloc/だよな? 元の領域は解放されずに残るよ。
だからrealloc前のポインタは保存しておかないとfreeできなくてリークしちゃう。

freopenは、成功しようが失敗しようが元のファイルはfcloseされる。
>>509
サンクスコ
これで、安心して眠れます
>>509

いやあ、昔々のC言語だと、reallocに失敗するとメモリが
解放されちまったのよ。そんなバカなと思うだろうが、
実際バカなので、今じゃ直ってるけどな。

ANSI-C以前の暗黒時代の話なので、今時そんな実装を気に
する必要はないが。
BCBスレで聞いてたのですが、こちらのスレの方にあってきたので質問させてください。
ある固定長のデータを構造体にコピーするときアライン以外に気をつけることはありますでしょうか?

char []="0123456789" を

struct hoge{
char a[4];
char b[3];
char c[3];
};
にコピーして要素ごとに処理しやすくしたいんです。
当然、各要素の最後に"\0"がないので取り出した要素の使い方にも注意が必要ではあるのですが。


char hogehoge[]="0123456789";
としてください。失礼。あ、"\0"が・・・うーむ・・・。
別にそのままでも変わらないような気がするんだが
やっぱウニオンかな
union hoge{
char hogehoge[10];
struct{
char a[4];
char b[3];
char c[3];
};
} hage={"1234567890"};

int main(){
fwrite(hage.a,1,4,stdout);
return 0;
}
515山崎 渉:03/07/15 09:33

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
質問です。
みなさんが gets ではなく fgets を使えと おっしゃるのは、getsにバッファ長の引数が無く、
バッファオーバーランの危険があるという理解でよいでしょうか?
>>516
>>1のC FAQ 日本語訳を見ての発言でしょうか?
>>514
printf("%.4s\n", hage.a);
或いは
printf("%.*s\n", sizeof(hage.a), hage.a);

って、書いてから気付いたけどstructに名前がついてないな。
struct {...} s;
として、
hage.s.a
か。

>>516
そうです。
>>518
hage.a にアクセスしたじてんで、hage.a は[1][2][3][4][\0]になるのでしょうか?
>>519
んなわきゃーない。
>>520
ああ、だからsizeof(hage.a)でブッコ抜くんすね。
"\0"がないから、char *tmp=hage.a; とかってすると、hage.bやらhage.c やらも引っ付いてくるのが
気持ち悪かったのでつ。
522デフォルトの名無しさん:03/07/15 20:37
int i;
for(i=0;i<10;i++) ;

無限ループになります。なんで?
コンパイラのバグですか?
おまえのPCが遅すぎるんだ
>>522
それはコンパイラのバグ

そういやIntelのコンパイラで
short i,j;
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("%d%d\n, i,j );
}
}
とやると、外側のループが1回しか実行されないバグがあったな
>>524
shortなんか使うなという教え
>>522
参考までにコンパイラと OS を教えちくり。
>>526
Mini-C,Win98SEです
Mini-Cってなんだろう・・・
Mini-C...初めて聞く名だ。
とりあえず Mini-C だと空ループは無限ループになる...と。 、、φ(.. ) メモメモ
Z80。。
531デフォルトの名無しさん:03/07/16 00:24
ネット上や参考書等のC言語ソースで、例えばfopen関数の戻り値はチェックするのに
fclose関数の戻り値をチェックをしていなかったりしています。なぜか自分も自然とそのように
プログラミングしてしまっていますが、このようにエラーのチェックをする時としない時があるのですが、
何を基準にしてする時としない時に分けられるのでしょうか?C言語に特化しておらず、抽象的な話かも
しれませんが、意見を聞きたいのでよろしくお願いします。
>>531
fclose()失敗したって何もフォロー出来ないからね…
>>531
戻り値を特に使用しない場合は受け取らない。
>>531
fopen(file, "r");
のときは
fclose()
の戻り値は無視していい。
しかし、
fopen(file, "w");
のときの
fclose()
の戻り値はチェックしてフォローする必要がある。

>>532
エラーメッセージくらい出さないのか?
>>534
どういう時に失敗するの?
つーか、その前に、読み書きで失敗しない?
for example.

/* ディレクトリエントリの読み出し */
FILE *fp = fopen("foo", "w");
char buf[200];
/* ここも当然、読むだけ */
fgets(buf, sizeof(buf), fp);
/* ここでは読みこみも書き出しも発生しないので通常、エラーになり得ない */
fclose(fp);

/* ディレクトリエントリの作成、当然ファイルの実体はない */
FILE *fp = fopen("foo", "w");
/* バッファリングされるのでここでは書き出されない */
fprintf(fp, "bar\n");
/* ここでフラッシュされるので、書き出しが行なわれる */
fclose(fp);

というわけで、ディスクフルのときにライト時のfclose()でエラーが発生する。
>>535
fflush(3)
close(2)
538531:03/07/16 00:53
malloc関数のようなアプリケーションエラーとなる致命的なところでは
エラーチェックは当然だと思うのですが、あたりまえのように
使っていたりするstrcpy関数等も必ずチェックしなければいけないと
思います。確かに戻り値を拾ってきてもエラー文出すぐらいしか
できませんが…。経験で知れということなのでしょうか。
>>538
strcpy()はエラーを返さない。
strcpy なんか使わんし。
>>536
それって、オープンした時にエラーが出るでしょう?

>>537
そりゃ、不正なポインタを渡せばエラーが出るのは当然で
そんなプログラム書く香具師の方が悪いと思うけど?
>>535
他のプログラムから削除されたりとか、
ディスクをいきなり取り出したりとか、
ディスクがいかれたとか、
まぁ、いろいろありそうやね。
特にゲーム機のメモリーカードとかだと
そういうことに気をもむ必要はありそうやね。
543531:03/07/16 01:04
strcpy -> strcmp 間違いでした。
>>542
メモリーカードか…
それは、考えた事なかったな…
fopenとかfcloseでメモリーカードのデータが読めるゲーム機なんてあるの?
システムコールとか使うんじゃないの?
546542:03/07/16 01:08
まぁ、ゲームプログラマからの受け売りなのだが。
>>543
strcmpはエラーが発生しない(errnoにだってなにもセットしないよね?)
しかしあれは戻り値を見ないと何も意味がない・・・
>>545
まぁ、何を使うかは別としてやね。
549535:03/07/16 01:15
基本的に他のプログラムに削除されるなんて事は考える必要ないと思うし
稼動中のディスクを抜き差しする香具師の事も考える必要はないと思うけど
(ディスクが壊れるのは(特殊なプログラムを除いて)論外)
確かに(ゲーム機に限らず)メモリーカードのように
動いてるのが見えないものの抜き差しは考えた方が良いかも知れないですね…
自分で検証もしないで推量だけで折角のヒントを否定する痛い
香具師が集まるスレはここですか?
>>550
違います
>>535
>基本的に他のプログラムに削除されるなんて事は考える必要ないと思うし

あ〜あ。
ついでに言えば、ディスクフルになることも考慮しないのかな?
>>552
それは絶対に他の何処かでエラーが出るでしょう
>>552
書き込み時にチェックしないの?(^_^;)
555553:03/07/16 01:27
ごめん、バッファに溜まってたら出ないね
556553:03/07/16 01:29
>>554
FILE *fp = fopen( "xx", "w" ) ; /* 開く */
fwrite ( buf, 1, 8192, fp ) ; /* バッファに溜まる */
fclose ( fp ) ; /* ディスクが一杯 */
>>556
いつもバッファリング無しにしているから
>>557
俺は必ずfflush()してるから失念してた
559557:03/07/16 01:40
まあ冗談はおいておいて、ディスクフルまで考えたことはなかったかなぁ。
>>559
フロッピーなんて、たった1.4MBしか使えないんだからすぐ一杯になるよ。
フロッピーってなに?
562557:03/07/16 01:46
>>560
そういえばそうだねー
メモリーカードもフロッピーほどじゃないけどディスクフルになる可能性が高いかも・・・
いつもHDにしか書き込まないもので
ところで、>>536のコードって、オープンした時に
NULLが返ってくると思うんだけど、
そのまま、fgets()やfprintf()にNULLを渡して大丈夫なの?
プレステ場合は容量決めとくのが普通だから
ディスクフルはあまり考えんでもいい気もする。
>>564
ゲーム機じゃなくて、フラッシュメモリとかを考えようよ
>>565
書き込む前に空き容量を調べるんじゃないの?
あれこそ他から書き込まれるおそれはないし。
>>566
Cに空き容量調べる関数なんて無いし
568566:03/07/16 02:09
カードの故障まで考えるとそうはいかないかな?
569566:03/07/16 02:10
>>567
Cの標準関数だけでやるのかよ!
段々スレ違いになってきた。
>>570
んじゃ、質問。
fopen()で得たポインタの実体がmalloc()で確保されてる場合
fclose()に失敗したら、その実体はfree()されるの?それとも、リークするの?
>>571
環境変数MEMLEAK_JOTOを検出した場合はリークする。
糞レスしたらスレ一覧のレス数に反映されんかった・・・
>>572
何その変数
ギャグなんだから笑ってやれよ
>>571
mallocで確保すると決められてはいない以上、どうなるかはライブラリのつくりに依存するんじゃない?
errno の取り得る値ってのは仕様では決められてないの?
>>576
まぁ、malloc()とは限らないけど、
基本的には、何かしらの方法で容量を確保する(されてる)訳で、
それを再利用出来るのだろうか、と言う事
それとも、どうせ僅かな容量なのだから、
そんな細かい事は気にするなって事なのだろうか…?
昔は何個くらいか固定長でとってある実装が普通だったと思うけど、
今はどうなってるんだろうね。
>>577
int












って話じゃなくて、何処から、何処までが処理系で
何処から、ユーザが使用して良いかって事?
>>578
様々な要因でfcloseに失敗してもメモリーの解放はできると思うから、しなかったらライブラリのバグじゃねーか?
>>580
errno の取る値がマクロか何かでよく定義されてあるけど、
それに互換性はあるのかってこと、と言ってもいいかもしれん。
>>581
でも、1度 fclose() に失敗しても、
もう1回やれば成功しない保証は無いと考えれば、
解放する方が、バグって考え方もあるよね
>>583
複数回クローズを試みるのか!
それは考えなかった!
>>582
互換性が無いから、値を #define してるのだと思われ
ちなみに、Cで標準に定義されてるのは
EDOM EILSEQ ERANGE
の三つだけ…
つーか、これ、1つも使った事ないし…
ERANGEってstrtolで発生するあれか

>>583
http://www.bohyoh.com/CandCPP/C/Library/fclose.html
無条件に解放しそう・・・
587デフォルトの名無しさん:03/07/16 03:13
K&R のさ、malloc/free の実装の説明のさ、morecore ってあるじゃん。
あれの 下から 2 行目くらいの free((void*)(up + 1)); って何?
俺にはどう見ても sbrk から返されて s.ptr が不定な状態のチャンクを
解放しに行ってるようにしかみえないんだけど、何がしたいの?
>>586
freopen()の説明なんか見ると、
失敗は無視するって書いてあるから、
fclose()も同様に、失敗は無視して解放するのかな…
と言う事は、1度fclose()に失敗したストリームに
2度目のfclose()は無いのだろうか…
>>587
ソースを見てみないと分からないけど、俺には
>free((void*)(up + 1));
が、何故キャストしてるのかの方が不思議だ
もしかして、upってポインタじゃないとか?
Cコンパイラさっぱりワカンネ
591デフォルトの名無しさん:03/07/16 14:56
最短経路を求めるアルゴリズムはDIJKSTRA法がありますが
最長経路を求める方法はありませんか?
>>585
なるほど。
標準なのは3つだけなんですか。
よく分かりました。
593デフォルトの名無しさん:03/07/16 15:07
http://lvpeace.hp.infoseek.co.jp/index.htm
   ↑
みなさん、薬物、犯す、暴力三昧の元暴走族が
子供を二人産み過去を自慢するようなHPを
立ち上げて「遠い過去の事です♪」などと平和に語っております。
どう思いますか。特攻お願いします。

抜粋
>過去の己を描いただけのHPであることをご理解して欲しい
>俺は最近の族じゃないから!過去だから過去、昔!OK?
>それで俺は最近は族ではなく任侠団体にいたんだよ
>ちゃんと読んでから書き込みして下さいね
http://lvpeace.hp.infoseek.co.jp/yaki.jpg
http://lvpeace.hp.infoseek.co.jp/zoku5.gif
594デフォルトの名無しさん:03/07/16 19:02
半角文字なら下のプログラムでできたんですが
全角文字じゃできません。考え方を教えてください。l初心者です。
scanf()やfor文とかしか知らなくてもできると言われたのですが
#include <stdio.h>
void main(void)
{
char a[100];
int i;
i=0;
scanf("%s",a);
while(a[i]!='\0')
{
i++;
}
for(i=i-1;i>=0;i--)
{
printf("%c",a[i]);
}
}
>>594
「全角文字」が2バイトの文字であるとする。
#define BYTE_OF_MBCHAR 2
#define STRINGNIZE_IMPLEMENTATION(x) #x
#define STRINGNIZE(x) STRINGNIZE_IMPLEMENTATION(x)
#include <stdio.h>
void main(void)
{
char a[100];
int i;
i=0;
scanf("%s",a);
while(a[i]!='\0')
{
i++;
}
for(i=i-BYTE_OF_MBCHAR;i>=0;i=i-BYTE_OF_MBCHAR)
{
printf("%" STRINGNIZE(BYTE_OF_MBCHAR) "s", &a[i]);
}
}
>>594
>半角文字なら下のプログラムでできたんですが
何が?
>全角文字じゃできません。
何が?
>考え方を教えてください。
何をしたいのか教えてください。
>初心者です。
言い訳のつもり?
597デフォルトの名無しさん:03/07/16 20:02
説明不足でした。
12SD と入れたら DS21
あ位う123絵オ と入れたら オ絵321う位あ
という感じに出力されるプログラムです
598デフォルトの名無しさん:03/07/16 20:10
ANSI以前の書式で書かれたソースをANSI形式に変換するツールってありますか?

int function(giko mona)
int giko
char *mona
{

}
↑のようなのを↓のような風に変換したいのですが、大量にあって手作業では時間がかかりすぎるのです。
int function(int giko , char *mona)
{

}
perl
コンパイルの仕方が分かんないです
OSウインドウズXP使ってるんですが
とりあえずBorland C++ Compiler 5.5落としてきて
#include <stdio.h>

maim()
{
printf("TEST");
}
てファイルをメモ帳で書いてtest.cって名前で保存してみたら
一応test Cファイルって出来ました。

コマンドプロンプト
C:\Document ***>bcc32 text.c
て入力してみたんですが
'bcc32' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
とかでます。
>>600
UNIXスレで見たような....
本家のFAQに書いてあるので、それも含めてFAQを全部見ておいたほうがいい。
http://www.borland.co.jp/cppbuilder/freecompiler/faq/bccfaq4.html
極私的C言語講座 - 環境設定 - Borland C++ Compiler (BCC) の場合
http://member.nifty.ne.jp/Norino/c_lang/c_lang_setup_bcc.html
>>594>>597
#include <stdio.h>
#include <string.h>
int main(void)
{
    const char s[11]="1山2本3山4";
    char s2[11];
    int i,l,c;
    for(i=0,l=strlen(s),c=0;i<l;i++)
        if(c){s2[i]=s[l-1-i+1];c=0;}//前がワイド文字
        else if(s[i]<=-1){s2[i]=s[l-1-i-1];c=1;}//ワイド文字
        else{s2[i]=s[l-1-i];}//普通文字
    s2[i]='\0';
    printf("%s\n",s2);
    return 0;
}
>>602
ありがとうございます。
結構分かり易いとりあえず書いてあることやってみました。
完璧と思ったのに、何故か
C:\>pathで
c:\borland\bcc55が出てきません・・・
環境変数のPATHのとこにはちゃんと書いたのに
てか、PATHの他の変数間違えて消しちゃったし・゚・(ノД`)・゚・
どうしおう
>>604
WinXPだったら一度ログオフしないといじった環境変数が有効にならなかったような。
>>605
ありがとうございます!
再起かけてみたらちゃんとなりました多謝!!

・・・でも血迷って消しちゃった他の変数は・゚・(ノД`)・゚・
ど、どうなっちゃんですかね。。。
607デフォルトの名無しさん:03/07/16 23:36
構造体のポインタの配列を考えているのですが、
構造体 STRUCT が STRUCT の配列
STRUCT **children;
を持つ構造体としたとき、
STRUCT test;
を考えます。
このとき、test の配列 children の要素数 length を動的に取得し、
test->children の要素数 length だけ malloc したいのですが、
test->*childeren = (STRUCT *)malloc(length * sizeof(*STRUCT));
だと、左辺側でエラーになります。
どうすればよいでしょうか。

よろしくお願いします。
sizeof(*STRUCT))
・・・でもbcc入力しても相変わらず
'bcc32' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
とか言われちゃいます。。。
>>609
BCCスレ池
611デフォルトの名無しさん:03/07/17 00:02
#include<stdio.h>
int main()
{
int *ptr;
int num[2];
ptr = num;
*ptr = 20;
*ptr++=100;
*ptr++=200;

printf("%d\n",num[0]);
printf("%d\n",num[1]);

return 0;
}

このプログラムを実行すると
100
200
と出力されるのですが、*ptr=20の値はどこに行ったのでしょうか?
またnum[2]→num[1]に変更すると
100
204
というように値が変わって出力されてしまいます。

ダーリン、オーバーランだっちゃ
>>607
意味が分からない
欲しいのは、ポインタの配列?
それとも、実際の配列?
やっぱりここもスレ違いなのか。。。
>>610BCCで検索しても何もでないんですよ。。。
タダで使えるBorland C++ Part3
http://pc2.2ch.net/test/read.cgi/tech/1054390397/
>>615
ありがとうございます
思いっきり似たような話題でてますね
さっきの質問コピペようかと思ったけど、ちょとじっくり読んでみます。
>>611
自分で上書きしておいてどこに行ったもなにもないでしょ
>>611
『後置インクリメント』でググってみよう。
619607:03/07/17 00:49
>>613
欲しいのは(malloc したいのは)構造体のポインタの配列です。
>>619
test->childeren=(STRUCT**)malloc(length*sizeof(STRUCT*));
621デフォルトの名無しさん:03/07/17 01:59
12SD と入れたら DS21
あ位う123絵オ と入れたら オ絵321う位あ
という感じに出力されるプログラムお願いします。
printf()、scanf()やfor文、if()、while()、for()、配列だけで
できると言われたのでそれらだけで作ってください。
同じ質問見たが、宿題か。
623デフォルトの名無しさん:03/07/17 02:07
ただしつこいだけです。constなんて習ってません
624デフォルトの名無しさん:03/07/17 02:39
>>623
習ってないなら自ら学べ
625_:03/07/17 02:40
626デフォルトの名無しさん:03/07/17 03:24
>>624
激しくガンガリます(`・ω・´)
627デフォルトの名無しさん:03/07/17 04:27
・・・正直みんなブチ切れています。
これが多額の税金で更生しPCの(?)職業訓練された元暴走族の方のHPです。
自分のかけた迷惑を省みず大事にしてるお子さんが二人います。

http://lvpeace.hp.infoseek.co.jp/index.htm
   
みなさん、薬物、犯す、暴力三昧の元暴走族が
子供を二人産み過去(+薬物の使用経験)を自慢するようなHPを
立ち上げて「遠い過去の事です♪」などと自慢気に語っております。
どう思いますか。掲示板へ直行お願いします。

抜粋
>過去の己を描いただけのHPであることをご理解して欲しい
>俺は最近の族じゃないから!過去だから過去、昔!OK?
>それで俺は最近は族ではなく任侠団体にいたんだよ
>逮捕12回(結構頑張ったでしょ)
http://lvpeace.hp.infoseek.co.jp/yaki.jpg
http://lvpeace.hp.infoseek.co.jp/zoku5.gif

正直、私たちの重税がこのような方に注ぎ込まれてる訳です。
施設・刑務官・警察の特別手当、いくらあっても足りません。
どうしたら理解して頂けるんでしょうか?
>>621
まず文字コード体系を判定する必要がある。
日本語などの多バイト文字はコード体系が変われば処理も変わる。
629_:03/07/17 04:42
630デフォルトの名無しさん:03/07/17 09:20
const char *c="abcdefg1234567890zx";
char str[16];
strcpy(str,c);
printf("%s\n",str);
printf("%c\n",str[0]);
printf("%c\n",str[18]);
getchar();
これが、コンパイル通るんだけどどういうこと?
[16]ってことは、[15]までだよね?VC6です。
631デフォルトの名無しさん:03/07/17 09:22
>>630
Cは配列の添え字チェックをしない。
str[18]は*(str+18)という意味なので文法上全く問題ない。
632631:03/07/17 09:23
三行目は見当違いだったかも。
とにかく文法上問題ないのでエラーになったりしない。
>>630
const char *c="abcdefg1234567890zx";
char str[16];
char aho[10];
strcpy(str,c);
printf("%s\n",str);
printf("%c\n",str[0]);
printf("%c\n",str[18]);
printf("%s\n",aho);/* これはどうなる? */
>>633
自動変数の確保の順番は未定義だったはず。
>>633
質問とまったく関係ない。
そしてそういう余計な話は初心者を混乱させるだけ。
>>635
オーバーフロウしたものがahoに入るかもしれないと言いたいんだと思われ。
でも>>634
>>630
コンパイルに関しては>631,632の通りだが
それ以前に
strcpy(str,c);
がいけないことだっていうのはOKなのかな?
18にアクセスしようとしてるからわかってそうだけど。
>>633
printf の第2引数は、constになってるから、警告が出るんじゃない?(コンパイラーにもよるけど)
ahoは初期化(値が設定)されていないのに参照される可能性がある。みたいな。
>>638
printfの第二引数以降は...だからなんでも受け付けます。
二行目と三行目のつながりが分からない。
>>633
これはどうなると聞かれても。
>630が自分のまだ答えてないよ。
>>639
せやった・・・失敬・・・
642デフォルトの名無しさん:03/07/17 21:08
こんばんわ。わからないことがあるので質問させてください。

unsigned int *buffer;
unsigned long int result;

buffer = (unsigned int *)malloc(2048);

for (row = 0; row < height; row++) {
       TIFFReadScanline(tiff, buffer, row, 0);

             for(x=0;x<width;x++){
               result = * ((unsigned int *)(buffer + x));
            
                printf("%d %d %u \n",row,x,result);
                         }
                       }

このようなループがあるんですが
row=0,x=533までしか実行できず、セグメンテーションエラーと言われます。
どのように修正すれば最後まで実行できるでしょうか。
ちなみに
TIFFReadScanline(tiff, buffer, row, 0);
は開いたtiff画像を一行読み取り、各ピクセルの輝度を16bitの整数としてbufferに格納します。
rowは行番号、0は画像番号です。

拙い文章でわかりづらいとは思いますがよろしくお願いします。
malloc(sizeof(unsigned int)*width)
rewindってどういうときに使うんでつか?
人生に疲れたとき。
646デフォルトの名無しさん:03/07/17 21:51
>>643
レスありがとうございます。

すみませんが、さらに質問させてください。

考えている対象は一行あたり1024ピクセルの画像で、
1024個の要素を持つint型の配列を読み込む事になるわけなので、
malloc(2048)としたのですが
これは 2byte×1024 = 2048byte ってことで
width = 1024 の時 sizeof(unsigned int)*width
と中身は同じかと思うのですが、いかがでしょうか?
int は 2 バイトとは限らない。
32bitなら4byteじゃないかな。
649646:03/07/17 22:11
今確認してみました。
intは4byteありました。お騒がせしてすみません。
どうも僕の中では、
char は 8bit で 1byte
int は 16bit で 2byte
と思い込んでいたみたいです。
どうもありがとうございました。
>>637
いけないこと?
とりあえず試してみたんだけど、通ったから
問題ないのかと思ってた。

18にアクセスしたのは、こういう場合は後ろの方は切れてしまうのかな?
と、思ったのでちょっと試してみたら参照できた。なんで?って感じ。
>>633のやってることの意味がまったく分かりません。
お、オーバー浮浪?
>>650
>通ったから問題ないのかと思ってた。

Cでは「未定義の動作」に気をつけにゃならん。
エラーが出ることすら保証されていない。

要するに、自分がしていることが本当に正しいかどうかを
自分で判断できにゃならんのだ。真に科学的な態度が要求される。

Cではと言ったが、これができる者だけが長い目で見てやってける香具師だ。
【GUIライブラリ】wxWindowsでのひょーん スレからやってきますた。
http://pc2.2ch.net/test/read.cgi/tech/1052186697/335

質問です。
bcc32 v5.5.1 な環境において、
char *setlocale(int category, const char *locale) の戻り値を
第二引数にして、setlocale() を再度呼び出すと、
第二引数が破壊され、戻り値が NULL になってしまいます。

一応調べたところ、下記のような記述
> The application shall not modify the string returned
> which may be overwritten by a subsequent call to setlocale().
> アプリケーションは返されたストリングを修正しないものとします、
> それはsetlocale()への後の呼び出しによって上書きされるかもしれません。
> http://www.opengroup.org/onlinepubs/007904975/functions/setlocale.html
がMSのサイトやらMAN pageやらから見受けられたので、この動作は未定義?
とも思うのですがいまいちすっきりしません。

これって、bcc32 固有の不具合なのでしょうか?
それともCの仕様でしょうか?

ちなみに、gcc では locale の設定が行われ、問題なく動作できますた。

よろすくおながいします。
>>651
未定義の動作だよって報告すら出ないのか?
struct List
{
std::string buf_;
}

と、

printf("%s",l1.buf_.c_str());

を日本語で説明おねがいします。意味がわかりませんでした。。
>>654
スレ違い。そりゃCじゃない。
>>654
マルチ氏ね
>>650
>strcpy(str,c);
文法的には問題ないのでコンパイルは通るけどコピーするサイズが問題。
strよりcのサイズが大きいために
strをオーバーしてコピーしてしまって
意図しないメモリ領域を壊してしまっている可能性がある。
(バッファオーバーフローとかオーバーランとか言う)

なのでstrがc以上のサイズを持っているかチェックしてからコピーするか
strncpyを使うかしる。
連結リストや二分木などがわかりやすくのってるサイトってないでつか?
マジお願いします。
659644:03/07/17 23:40
お願いします・・・。scanfと関係があるんですか?
バッファに文字を残した場合に、それをリフレッシュするって感じでしょうか?
>>659
いいえ
いいえ
661644:03/07/17 23:44
>>660
ではどういった場合に使うのでしょうか?
>>658
二分木載っているけど、これでよければ
tp://www1.cts.ne.jp/~clab/hsample/Mem/Mem2.html#void
>>659
fseek(fp,0L,SEEK_END);
と同じで、scanf()とかとは、直接的には全く関係ない
ただ、rewind()すると、EOFをクリアしたり等々
標準入力で便利に使える処理系が多いのも事実
>>644
ファイルの先頭から読みなおしたいときによく使うが。
665644:03/07/17 23:52
>>663
標準入力で便利に使えるというのは具体的にどういった場合なのでしょうか?
666663:03/07/17 23:52
突っ込んでくれないと、おぢさんは悲ひい…
突っ込んでやるから、ケツを出せ
>>663
> fseek(fp,0L,SEEK_END);
(void)fseek(stream, 0L, SEEK_SET) だろ
>>665
>EOFをクリアしたり等々
って書いてあるじゃん
670644:03/07/18 00:05
標準入力からのEOFはCtr+Z?
whileの判定でEOFを使ってるならまだしも、コントロールコードを用いてる場合は、
意味がありますか?
標準出力で rewind すると、
キーバッファクリアになる処理系が存在する。
672671:03/07/18 00:51
出力じゃなくて入力だ。
>>671
それを標準の動作であるかのようなことを言っていた人がいたね。
'\0' は必ず 0 で定義されるんですか?
'\0'==0
文字定数か整数定数かの違い
>>675
その等式はどのコンパイラでも正しいですか?
C言語の規格として定まっているんですか?
>>676
手持ちの ANSI C/C++ 辞典には
「すべてのビットは 0 である」と書いてあるので、
大丈夫だと思います。
ところが整数0について「すべてのビットは 0 である」という記述はない。
よって'\0'==0という保証もない。○か×か
×に一票
>>678
0 と等しい内部表現を持つ、
という意味で全てのビットが 0 である、
と言ってるんだと思うので×。
でも、その視点は無かっただけにちょっと感動した。
あ、整数値としての 0 ね。
ヌルポインタじゃなくて。
文字定数は 'ab' のように、複数の文字からなる場合の値は
処理系定義となっているが、'\0\0' なら全てのビットが 0 なので
'\0\0' == 0 は成り立つ ○か×か
処理系定義なので何が起こっても構わないので×。
>>683
処理系定義が、何が起こっても構わないってのはダウト
おまえら糞壁と一緒だな(藁
>>657
あーなるほど、そういうプログラムがあるからOSが不安定になったりするのかな?
気を付けるようにします。
687ゲット!!

>>686
時々セキュリティ情報などでバッファオーバーフロウが云々という記事をみかけるでしょ?あれ。
688687:03/07/18 12:59
657に書いてあるじゃん(鬱
あんなのがあるって事は。
M$の社員にも糞がいっぱいいるってことか。
690デフォルトの名無しさん:03/07/18 15:55
VC++で、
文字列が英語の文かどうか判定したいです。
全角文字なら英語でないとすると、

こんなもじ↓

が全角文字で英語にならなくなってしまいます。
上の文字は英語のサイトでも使われてる文字なので、英語として扱いたいです。
>>689
実際にはコードの時点からオーバーしてるわけじゃなくて
何らかの方法で無理矢理あの状態を作り出されたときに
サイズチェックしてなくてあぼーんするって感じかな。
まあよく知らないんだけど( ´д`)
"と“は別物だが?
(C), (R), TM あたりで困るというのなら分かるけど。
英語のサイトで全角文字か…
>>690
先ずは文字コードについて勉強しろ。話はそれからだ。
695デフォルトの名無しさん:03/07/18 16:27
エスケプシケンス使わずに画面をクリアするには、
printf("system・・・・
よく覚えてないです。
どなたか教えてください
おまえら、画面制御の質問するときは



   環  境  を  書  け
697デフォルトの名無しさん:03/07/18 16:36
すみませぬ。
WinXP、BCC5.5です。
環境を書いてなくてすみませんでした。
698デフォルトの名無しさん:03/07/18 16:37
system("cls");  /* DOS */
system("clear"); /* UNIX */
おまえら、画面制御の質問するときは



   そ の 環 境 の ス レ に 行 け



だろ?
700デフォルトの名無しさん:03/07/18 16:46
>>698どうもありがとうございます。
勘違いしてました。
タブキーを押すと右に*が移動し、3回動いたら改行する
プログラムを作りたいんですが、根本的に間違ってますでしょうか?
まだ作りかけですが、どうか見てください
#include <stdio.h>
#include <conio.h>
int main(){
int a=1,b=1;
char Key;
for(;;){
system("cls");
Key = getch();
if (Key=="\t"){
a++;
if(a<=3){
printf(" *");
}
else{
printf("\n");
b++;
a=1;
}
}
}
}
701690:03/07/18 16:53
>>694

文字コードはShiftJISでやってます。
クリップボード経由のデータなので、もともとの文字コードは意識してないです。
>>700
コンパイルを通してから出直せ。
703700:03/07/18 17:24
コンパイル通るよん♪
まさか、君Cやったことないでしょ?
( ´_ゝ`)プッ
>if (Key=="\t")
> if (Key=="\t"){
> if (Key=="\t"){
> if (Key=="\t"){
> if (Key=="\t"){
> if (Key=="\t"){
706デフォルトの名無しさん:03/07/18 17:28
正しくはif(Key==\t){
>>706
ネタはもういいから。
#include <stdio.h>
#include <conio.h>
int main(){
int a=1,b=1;
char Key;
for(;;){
system("cls");  // 画面を消す。
Key = getch();   // 入力するまもなく通り過ぎる
if (Key=="\t"){  // Keyの初期値(ごみ)と文字列リテラルのアドレスを比較する。
a++;         // aが2になる。
if(a<=3){       //必ず真になる
printf(" *");    //*を表示
}
else{         //以下のコードは通ることなく終了。
printf("\n");
b++;
a=1;
}
}
}
}

( ´_ゝ`)プッ
それはそうとして conio.h なんか使ってるんだったら他所へいけ。
違った、最初のifがすでに成り立たないや。
何も表示せずに終了か。
>>708
こいつもひどいな。
712デフォルトの名無しさん:03/07/18 17:44
正しくはif(Key==\t){
質問者が煽るとグダグダになるという好例ですな。
714700:03/07/18 17:52
>>703は偽物です。
でも、やっぱりコードがぐちゃぐちゃなのは確かでしたね。
>>712
マジですか?
正しくは
if(Key == '\t') {
716デフォルトの名無しさん:03/07/18 17:55
どうでも良いけど無限ループじゃない?
717716:03/07/18 17:59
700の正しくしたコードきぼんぬ
718デフォルトの名無しさん:03/07/18 18:05
>>717
どうでも良いけどなんで俺を騙るんだ?
719716:03/07/18 18:27
>>718
なんで俺が煽ったことになるんだ?
>>719
お前は俺じゃないだろ
721デフォルトの名無しさん:03/07/18 18:30
煽ると騙るを間違ってる香具師ハケーン
>>721
二人いるな
>>717
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main() {
  int a = 1, b = 1, i;
  char Key;

  system("cls");

  while( (Key = getch()) != 'q' ) {
    system("cls");
    if (Key == '\t') {
      if ( a <= 3 ) {
        for (i=0; i<a; ++i) printf(" *");
        ++a;
      } else {
        printf("\n");
        ++b;
        a = 1;
      }
    }
  }
  printf("\nb = %04d\n", b);
  return EXIT_SUCCESS;
}
724716:03/07/18 19:08
>>720
偽物は静かにしてくれ。

>>723
>>700との違いが分からん。
>>700は何がダメなのか。
>>724
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int main() {
  int a = 1, b = 1, i;
  char Key;
  system("cls");
  while( (Key = getch()) != 'q' )
    if (Key == '\t') if ( a <= 3 ) printf(" *", ++a); else printf("\n", ++b, a = 1);
  printf("\nb = %04d\n", b);
  return EXIT_SUCCESS;
}
726デフォルトの名無しさん:03/07/18 19:18
>>724
#include <stdio.h>
#include <conio.h>


int main() {
int a = 1, b = 1, i;
char Key;
system("cls");
while( (Key = getch()) != 'q' )
system("cls");
if(Key == '\t') if ( a <= 3 ){
printf(" *", ++a);
}
else {
printf("\n", ++b, a = 1);
}

}
727_:03/07/18 19:21
728デフォルトの名無しさん:03/07/18 20:55
これってどうして二回目のscanfはスキップされるんですか?
よろしくおねがいします

#include<stdio.h>
void main(void){
char c,d;
scanf("%c",&c);
scanf("%c",&d);
printf("%c %c",c,d);
}
スキップはされない。
ちゃんと改行を読み取って表示する。
730デフォルトの名無しさん:03/07/18 21:08
>>729
即レスありがとうございます。

どうにかして改行を読み取らないようにはできないでしょうか?
printf("Hello", " ", "world");
732デフォルトの名無しさん:03/07/18 21:09
>>730
一行読みとる
733デフォルトの名無しさん:03/07/18 21:10
ちょっと質問させてください。
引数を整数に直してから表示するプログラムにしたいのですが
以下のようにすると、引数と違った結果になってしまいます。
どうしてでしょうか?


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

main(int argc, char *argv[])
{
int a,b,i;
int x[1],y[1];

x[0] = atoi(argv[1]);
y[0] = atoi(argv[2]);
x[1] = atoi(argv[2]);
y[1] = atoi(argv[3]);

for (i=0;i<2;i++){
printf("%d %d %d\n",i,x[i],y[i]);
}


}
734デフォルトの名無しさん:03/07/18 21:11
>>733
オーバーフロウとか
735734:03/07/18 21:14
ふたつの意味でね(^_^;)
>>731-732
できました!
ありがとうございます!
737!=733:03/07/18 21:22
ホントに2つだ。。はじめ気づかなかった。
>>733,737
ちみら、VB出身だな!?
739デフォルトの名無しさん:03/07/18 21:29
名前を並び替えたいんだけど、エラーが出てしまう。
どこを直せばいいです??マジでわかんないもんで。

{
char name[5][9] = {"yamada","kawasaki","ishikawa","machida","fukui"};

char tmp[9];

int i, j;

for (i = 0; i < 4; i++){
for (j = i + 1; j < 5; j++);{
if (name[i][0] > name[j][0]){
tmp = name[i]; /*エラー「左辺値が必要(関数 main )」*/
name[i] = name[j]; /*エラー「左辺値が必要(関数 main )」*/
name[j] = tmp; /*エラー「左辺値が必要(関数 main )」*/
}
}

}

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



return(0);


}
740デフォルトの名無しさん:03/07/18 21:31
>>739
配列名に代入はできないから。
配列のコピーはmemcpyで。


そういうもののソートは元のデータをポインタ配列にした方がいいと思うけど。
文字列は = じゃコピーできん。
strcpy()つかえ。
742740:03/07/18 21:34
誰もソートとはいってねーか。スマソ
743733:03/07/18 21:43
え〜?
さっぱりわからんです。ヒント下さい。
744739:03/07/18 21:45
>>740
>>741
文字列は数字みたいに代入することはできないってことか。感謝です。
でもそれをどうやって使えばいいかぜんぜんわかんない。。。。
ありがとうございました。
>>743
int x[1]で使えるのはx[0]だけ。x[1]を使いたかったらint x[2]とする
746739:03/07/18 22:00
ポインタ配列にしようと思って配列をポインタ配列にしてみたけど
( name[5][9 を *name[5][9] など)
コンパイルの時にエラーは出なかったけど実行したらエラーがでてしまった。
どこをどう直せばよかったんですか??
747733:03/07/18 22:04
>>745
あ、ありがとうございます。
うわーはずかしいー。
748デフォルトの名無しさん:03/07/18 22:04
ポインタには値は入れられないから、アドレスを入れる
たとえばint *i; int j=5; と言う場合
i = &j; って感じに
&は変数のアドレスっていう意味
749!=733:03/07/18 22:09
x[0] = atoi(argv[1]);
y[0] = atoi(argv[2]);
x[1] = atoi(argv[2]);  /* 3じゃ */
y[1] = atoi(argv[3]); /* 4じゃ */
750デフォルトの名無しさん:03/07/18 22:13
シューティングゲームみたいに上から☆がランダムで
5個降ってくるというふうにCのコンソールで表現したいのですが、
アルゴリズムはどうしたらいいでしょうか?
サンプルがあればお願いします。
できればコメントもお願いします。図々しくてすみません
751mainの戻り値:03/07/18 22:14
main()の戻り値、成功なら0、失敗なら1とするのが普通と思うのですが、

で、実際stdlib.h(以下はgccの例)に
#define EXIT_FAILURE 1
#define EXIT_SUCCESS 0
とか書いてありこのマクロを使えというのを昔読んだ記憶があります。とはいえ
しかし、このマクロ使っている人を見たことがありません。

これってどこかで使われてます??
>>751
OSに依存しないプログラムを書くときは使ってるよ。
>>751
失敗時はfprintfの戻り値にしている。
755デフォルトの名無しさん:03/07/18 22:29
>>750
Cでは無理なんじゃないの?
>main()の戻り値、成功なら0、失敗なら1とするのが普通と思うのですが、

普通って?
実行環境とのインターフェイスをキミはどう設計しているの??

コーディングの段階で悩むに至った過程こそ
そんなくだらんことが誤差にもならん程の深刻な問題だぞ。
mainの戻り値はそのプログラムを誰が起動するかでおのずと決まってくる。
hello world の戻り値なんて、ユーザが起動して戻り地なんか無視しているんだからどーでもいい。
758デフォルトの名無しさん:03/07/18 22:34
doubleの方がよかったのに
759デフォルトの名無しさん:03/07/18 22:36
>>757
勝手にhello worldを起動するのがユーザと決め付けるんじゃねーよ。
/bin/false
761757:03/07/18 22:37
一般論をいったまでだがね。
後学のために、どんなシステムでhello worldを起動しているのか教えてほしいものだ。
CGI
763デフォルトの名無しさん:03/07/18 22:39
>>761
一般論というのならhello worldじゃなくて一般的なプログラムで
話そうじゃないか。 そのプログラムを起動しているのは誰かね?
764デフォルトの名無しさん:03/07/18 22:40
>>750
APIを使うしか方法はない。
あとは、他の誰かに聞け
765デフォルトの名無しさん:03/07/18 22:42
>>764
はぁ?

cygwin使っても出来ますが何か?
main関数もライブラリ化しましょう!
767デフォルトの名無しさん:03/07/18 22:43
>>726のコードは何をするためのプログラムですか?
>>767
clsを呼びまくる。
769亀さん:03/07/18 23:12
>>674-681
Cでは文字定数はint型で'\0'は、8進表現の0を表す
よって、'\0' == 0 は必ず成り立つ
常にこういうシェルを通して実行するような
用心深い人もいるかもしれないね。

#!/bin/bash -f

if (( $# == 0 )); then
exe=./a.out
else
exe=$1
fi

if $exe; then
echo 'success!'
else
echo 'failure...'
fi
>>750
アルゴリズムが何なのか分かっているのか小一時間(略)
772デフォルトの名無しさん:03/07/18 23:38
ずれたら・・・
   ,,--―'''""`ヽ'         ̄`ヽ、
           /        ヾ  /       ~`ヽ
         /           ヽ;:  /"""ヾ   ヽ
        /        ;:;;:::''''   l /;:;;:::'''  \   i
      /        /;:;;:::'''           ヽ  ヽ
      |         |  _,,___       . _,,,,__,_ヽ  |
      /        ;/ /   ゙^\ヽ..  , /゙   ¨\,.-
     /        ;:;:ヽ「 ●     | 》  l|    ● ゙》ヽ
     i          /i,.      .,ノ .l|  《      .|ヽ ヽ
     |          | \___,,,,,_/ .'″ ^=u,,,,_ v/ | |
     |          |.                  |. |
     |         ;:|           :::::::       | :|
      |         ヽ.         ( ,-、 ,:‐、   | | 
      |       /ヾ..                  | |
      |          |         __,-'ニニニヽ .  |  |
..       |        `、ヽ        ヾニ二ン"  /  |
        |         ヽ\             /  |
        |          l  `ー-::、_       ,,..'|ヽ./ 
        ヽ.        :人      `ー――'''''  / ヽ
        /;:;:;:;;:;:;: _/  `ー-、          ,.-'"   \ー-、
           ,.-'"  \:      \      .,.-''"     |
         /.     \        ~>、,.-''"      |
    ,,..-‐'''""        ヾ    ,.-''"|    /――――、/
773772:03/07/18 23:40
やべっ。なんか変な風にズレてしまった。
774デフォルトの名無しさん:03/07/18 23:50
forループでループを回してループ変数 i という名前の
ファイルを読み込む場合どのようにすればよいでしょうか?
もしくは、i.txt というファイルを読み込むにはどのように
すればよいでしょうか?
atoiみたいにiを文字列に変換できればよいのですが。
itoaか
776デフォルトの名無しさん:03/07/18 23:59
http://gametui.hp.infoseek.co.jp/c7.txt
このテトリスすごいんですけど。
このくらいのコードはCを始めてどのくらいでかけるものなのでしょうか?
本人に聞け
sprintf()だな
>>776のファイル名からCで書いた七行テトリスだと期待したのは俺だけか?
780名無し:03/07/19 00:17
>>779
おれも思った
781739:03/07/19 01:25
>>748
ポインタ配列にすればいいんですね。どうにかそこまでたどり着きました。
ありがとうございます!!

782774:03/07/19 01:36
>>775
itoa・・・ですか?
自分の持っている本には載っておらず、ネットで調べても
良く分かりませんでした・・・。

>>778
なるほど。sprintfですね。
char str[20];
初期化子以外で、この配列をすべて'x'で初期化する関数があれば
教えていただけないでしょうか。
>>783
memset()
785783:03/07/19 01:48
>>784
ありがとうございました。
最後の '\0' を入れないと文字列としては機能しないけどね。
787デフォルトの名無しさん:03/07/19 02:11
任意の変数の値を交換する関数を作りたいんだけど
俺が考えたのは

void swap(void *a,void *b,unsigned int size){
void *temp;
if(a==b)
return ;

temp=melloc(size);
memcpy(a,temp,size);
memcpy(a,b,size);
memcpy(b,temp,size);

free(temp);
return ;
}

サイズを渡さずに引数が交換したい変数だけの関数って作れる?
788デフォルトの名無しさん:03/07/19 02:12
>>787
#define SWAP(a, b) swap(a, b, sizeof(a))
789デフォルトの名無しさん:03/07/19 02:13
>>787
マクロを選ぶか、関数を選ぶか、
マクロだけを公開するか。
StandardCLibraryって本(C標準ライブラリ実装演習)に載ってるよ。

読んだ事なければ、暇つぶしに良いかも。

ちなみに、Cに限定する話しか乗ってないから、これを全てだと思って、
こだわって立ち止まらないように。
そこらおじいさんと同じになっちゃいます。
>>787
君が欲しいのはコレであろう
http://pc2.2ch.net/test/read.cgi/tech/1038215563/463
>>786
ありがとうございます。気をつけます。
792デフォルトの名無しさん:03/07/19 02:21
>>788
なるほど。
でもaはポインタでしょ
sizeof(a)が返すのはポインタのサイズじゃないの?
#define SWAP(a, b) swap(&(a),&(b), sizeof(a))
勘違いしてたら突っ込んで

>>789
その本は知らないな。
機会があれば読んでみます。
俺ならこーする。

#define SWAP(a, b, type) do { type c = b; b = a; a = c; } while(0)
794787==792:03/07/19 02:27
>>793
なるほどねぇ。
いろいろあるんだな。
ちょっと感動した。
>>787
1バイトずつ交換すればmallocを使わずにできる。
796kgp:03/07/19 03:14
#include<stdio.h>
#include<stdlib.h>


struct person{
int number;
int height;
int weight;
int sex;
int i;
}

int main()
{
struct person date[20];
int i = 0;

printf("番号、身長、体重、性別を入力してください.\n");
printf("ただし番号は2桁、身長は150〜180、体重は45〜90、性別は男が1で女が2というようにしなさい.\n");

while(getchar() != EOF){
scanf("%d%d%d%d",&date[i].number,&date[i].height,&date[i].weight,&date[i].sex);
i++;
}

return 0;
}
自分ではうまくやったつもりなのですが
コンパイルできません
どこをいじればよいですか?
;が抜けてる
>>793
ちょっと do-while を使う意味が分かりません。
普通にブロックで囲んだだけじゃダメなんですか?
>>798
それが分かるようになるまで、ブロックに囲むだけで良いよ
普通の関数と同様に使ってれば、多分、分かる事だから
>>800
もったいぶらないで教えてくれよ。
802デフォルトの名無しさん:03/07/19 03:50
>>799
神!!

俺もそうしよう

これ以降この話題に触れたやつは切る
>>798
そんなもの使うな、どうせ関数と全く同様に使える訳ではないんだし
それがどうしても必要ならばそろそろC++にうつる時期だ

そんな間に合わせのかたわ位で了見の狭い奴が多いな。
俺はそういう奴が大嫌いだ。だから教えてやる。
if()SWAP();elseとかを考えてみろ
>>802
そんな事言わずにさ
どうせ教えるなら、少しひねって、
if()SMAP();else
とかにすれば、可愛げがあるものを…
806デフォルトの名無しさん:03/07/19 04:08
>>803
偉そうに書いてるけど、一般人にとっては常識(w
なんかばっさり切られてるね?
一般人=プログラマではない=知らない=常識ではない
>>803
全部大文字にしてあることでマクロであると警告し、
ここに代入文なんぞ突っ込むな! という主張を行っている。
そして、セミコロン対策するのはエディタの自動インデント対策でもあるし、
セミコロンがいるのかいらないのか悩む必要もなくなる。
下らんトリック使わずに仕様書にマクロだと注意書きしろよ。
>どうせ関数と全く同様に使える訳ではないんだし

これにつきる
>>811
putchar(*p++);
>>812
何を言いたいのかわからないが、それはきちんと「引数を複数回評価するマクロとして実装されているかもしれない」と書かれている。
注意書きがあるよりも、マクロはマクロらしくあって欲しいし
副作用の発生する関数の呼び方はして欲しくない。
815813:03/07/19 13:11
わ! 恥ずかしい・・・

>>812
すまない、812が>>810へのレスと勘違いしたよ。
>>813
>と書かれている。

何に?
少なくとも規格書ではあるまい

7.1.7 ライブラリ関数の使用法
マクロとして実装されたライブラリ関数の呼び出しでも、
その実引数がただ1回だけ評価され、
かつ必要な箇所ではカッコによって完全に保護されるような
コードに展開されなければならない。

7.9.3.9 putchar関数
int putchar(int c);
(マクロとは一言も書いてない)
常識とか言ってた人、もう来ないだろうねw
まあ C のマクロなんて糞なものは使わないのがベター。
>>818
#define putchar(c) putc(c, stdout)
#deinfe putc(c, fp) do { int x = (c); fp->pos < fp->capa ? fp->fp[fp->pos++] = x : fputc(x , fp); } while(0)
>>819
つかわねぇなぁ。
>>819
int x; for (x = 0; x < 256; x++) putchar(x);
整数値をstdinから読み込むとき
scanf("%d%c" , &hoge , &damy) ;

fgets(buff , sizeof(buff) , stdin) ;
sscanf(buff , "%d" , &hoge) ;
となら
どっちが安定ですか?
>>818
struct node {
 int nodekind ;
 union {
  struct {
   int childs ;
   struct node *child[MAX] ;
   int low[MAX] ;
  } internal ;
  struct {
   int leafkey ;
   int data ;
  } leaf ;
 } u ;
} ;
#define CHILDS u.internal.childs
#define LEAFKEY u.leaf.leafkey

使っとけ
>>822
安定って意味がわからんが、一般的には下のほうが良いとされている。
>>822
せっかく>>1にC FAQのリンクがあるんだから、隅々まで見てきなされ
>>824
scanf("%d%c" , &hoge , &damy)
こいつだと起きそうな不具合ありますかね?
葉鍵?
>>821
あー、Compilerだけで使いたい変数・関数はアンダースコアで使う。
プログラム側はつかっちゃだめとかあったような。

ちなみに、ローカル変数は名前重複可能って、++だけだっけ?
>>828
ブロック内で定義された変数はその外部に影響しないから名前の重複は無問題。

>>826
数字の後にすぐ改行があるとは限らない。
>>822
要求仕様ではbuffの中の食べ残しをどうすることになっている?
>>828
アンダースコアなんて気休めにもならないよ、
ベンダとユーザの境界は常に1つじゃないんだから。
例えばSystemCなんてどっちになる?

ちなみに、ローカル変数だって1つの式の中で2回++はだめだよ。
int giko;
void mona(void)
{
int giko;
{
int giko
}

キミが聞いたことあるのは
おそらくこれがOKってだけのことだろ。
その++じゃないだろ〜
>>829
処理系定義のマクロがアンダースコアで始まる変数や関数を参照していたら?
834824:03/07/19 22:34
>>822

例えば、以下のようなコードの場合、

#include <stdio.h>

int main(){
int hoge;
char damy;
scanf("%d%c" , &hoge , &damy);
printf("hoge'v value = %d \n",hoge);
scanf("%d%c" , &hoge , &damy);
printf("hoge'v value = %d \n",hoge);
return 0;
}

実行結果は以下の通り

./a
1234
hoge'v value = 1234
a
hoge'v value = 1234 <- 前の奴が残っている
835デフォルトの名無しさん:03/07/20 00:02
>>834
scanfの戻り値チェックシヨーネ

sscanfとか関係ねー
何言ってるんだ?
837デフォルトの名無しさん:03/07/20 00:20
>>836
scanfの戻り値はパースに成功した引数の数
damy
が恥ずかしいな
恣意的には、恥ずかしいのはこれで
>int main(){

>damy
は、恥ずかしくない。
好きな女の子の名前付けたっていいじゃんかよう!ヽ(`Д´)ノ ウワァァン
釣りか?
釣りだな?
釣りなのか?
釣りなんだろ?
釣りなんですか?
C調言葉なら俺に聞け!
C調て。オサーンですか?
サザンだろ
845デフォルトの名無しさん:03/07/20 01:59
>>816
JISの規格書にはっきりと書かれている

7.9.7.9 putchar関数
機能 putchar関数は、第2引数としてstdoutを指定したputcと等価とする。

7.9.7.8 putc関数
機能 putc関数は、fputcと等価とする。ただし、マクロとして実装されたputc関数は、streamを2度以上評価することがある。したがって、実引数streamは、副作用を伴わない式でなければならない。
846845:03/07/20 02:00
あ、、しまった。二度以上評価するのはstreamか・・・・
847845:03/07/20 02:02
ということは>>812はなんら問題ないわけだから、812は何をいいたかったんだろう・・・
848デフォルトの名無しさん:03/07/20 02:32
>>847
全てのコンパイラがJIS準拠だと思ってる香具師はDQN
つまり、
FILE **fp;
の時に
putc(c,*fp++);
みたいな使い方は駄目って事か
正直、知らんかったな…
まぁ、普通に書いてて、そんな書き方する事はないけど…
JISの規格とANSIの規格は違うの?
ただの翻訳
>>850
章のナンバーが微妙に違う
読み方 : ジス
フルスペル : Japan Industrial Standard
工業標準化法に基づいて、すべての工業製品について定められる日本の国家規格。コンピュータと情報処理はX部門にまとめられている。

読み方 : アンシ、アンジー
フルスペル : American National Standard Institute
アメリカ国内の工業製品の規格を策定する団体。1918年に設立された。日本のJISにあたる。
そこで何故ISOの解説がありませんか。
>>848
処理系を特定せずに話している限り、それは仕方ないだろう。
どちらかというと>>793,>>798,>>799,>>803,>>806,>>809,>>811の流れで
>>812のような例を出していることが愚かしいとの>>816の指摘に対して
出展を明らかにしない>>819は空疎な悪あがきとしか言いようがない。
>>854
しーーーーっ!
せっかくオモロイのにぶち壊すなよ
857デフォルトの名無しさん:03/07/20 10:54
(,,*゚o゚*)<
858デフォルトの名無しさん:03/07/20 10:57
(,,*゚o゚*)< ふぇろもん!
??
> 恣意的には、恥ずかしいのはこれで
> >int main(){

int main(void) または int main(int,char**)にしてくれってこと?
あるいは、int main(int,char **,char **)か。

* 恣意的って日本語の使い方あってるのかどうかさえ解らん。
ttp://members.jcom.home.ne.jp/w3c/kokugo/kotoba/Shiiteki.html
一瞬、ιぃかとも思ったよ...
C的には
mainを他の関数から呼び出すことはないからint main()でもいいと思うけど・・・
>あるいは、int main(int,char **,char **)か。

ワラタ
863デフォルトの名無しさん:03/07/20 17:28
ポインタで詰まってます。
間接参照でしたっけ。よく分かりません。
説明してもらえませんか?
#include <stdio.h>

int main()
{
int *po , var;
var = 100;
po = &var;

*po = 1010;
printf("変数varの値 = %d" , var);

return 0;
}

>>863
そのコードを100回くらい読み直してみろ。
メモリのどこかにint型の領域がある。
普段は名前(var)でアクセスする。
&を付けるとアドレスを返す。
ポインタ(po)にはアドレスが入る。
ポインタに*をつけると名前(var)でアクセスしたのと同じようにアクセスできる。
メモリっていうのは address と value で出来ていて、
int var で宣言された変数 var は value を持つんだけど、
int *po で宣言された変数 po は address を持つことが出来る。

ゴメン、上手く説明出来ないや。アーキテクチャを学ぶと良いかも。
867デフォルトの名無しさん:03/07/20 17:58
>>863
そのコードだと、poにvar(=100)のアドレスを格納した後、
poの指す先(var)を改めて1010に設定していることになる。
だから、vsrの値も100から1010に変更され、1010が表示された。
868_:03/07/20 18:00
アセンブラを先にやってるとptr+=sizeof(int)とかして悩んだり悩まなかったり(w
870デフォルトの名無しさん:03/07/20 19:07
po = &var; //varの値(100)をポインタ変数poに代入
*po = 1010; //?

うわぁ、分からないヽ(`Д´)ノ
871デフォルトの名無しさん:03/07/20 19:30
>>870
*と&の意味ワカル?
ポインタというのは2つの要素から出来ている。
1つはアドレス。もう1つは参照先の型。
アドレスというのはメモリ上の位置のこと。
そのポインタを入れることの出来る変数がポインタ変数で、
int *po;
のように宣言すると、po がポインタ変数になって、
参照先の型は int であると仮定される。

ある変数のポインタは & を使えば得られる。
例えば
int var;
の var のポインタが欲しければ &var とすれば得られる。
これを po に入れるには、普通の代入
po = &var;
を使えばいい。
>>870
>po = &var; //varの値(100)をポインタ変数poに代入
違う。
さて、ポインタがあると何が出来るだろうか。
メモリ上の位置と、その型が分かっているので、
そこの値を参照したり、そこに値を入れたりすることができる。
それを行うには * というものを使って
*po = 100;
とか
printf("%d\n", *po);
とかすればいい。
*po とすると、po の中に入っているアドレスを始点とした
int のサイズの領域を参照することができるのだ。
875870:03/07/20 19:44
>>873
違いますか・・・
で、ポインタと普通の値との違いを見てみよう。
例えば
int var = 100;
int num;
だとして、
num = var;
としたとしよう。
この場合、num に渡されるのは 100 という値だ。
つまり、var と num という二箇所にそれぞれ 100 という値があることになる。
この場合、var++; としても、var は 101 になるが num は 100 のままである。

一方ポインタの場合は渡されるのはメモリ上の位置であって、値そのものではない。
つまり、100 という値が入れられた場所は相変わらず var の一箇所のみである。
位置を共有しているので、var++; とすれば var も *po も 101 になるし、
同様に (*po)++; とすると var も変わる。
なぜなら、var と *po はメモリ上の同じ領域を表しているからである。
877デフォルトの名無しさん:03/07/20 19:46
*po = 1010
最後の一文はその前の文の先頭と同じこと言っちゃってた。スマソ。
#include <stdio.h>

int main()
{
int *チャンネル , 番組;
番組 = めざましテレビ;
チャンネル = &目覚ましテレビ; //チャンネル = 目覚ましテレビのチャンネル

*チャンネル = 僕だけのマドンナ; //このチャンネルの番組 = 僕だけのマドンナ
printf("変数番組の値 = %d" , var);

return 0;
}

上手く説明できんなぁ
880デフォルトの名無しさん:03/07/20 19:54
*(アスタリスク)は単体ではなく型の一部です。
つまり
int *i;とあると、アドレス型の入れ物に&(アンパサンド)でアドレスを
抽出していれる。そうすると、iはそのアドレスを示すのです。
つまり *iではなく、int *であってiはただの入れ物です。
881デフォルトの名無しさん:03/07/20 19:56
po = &var; //
*po = 1010; //

これにコメントを付けてみると・・・
では、このポインタを使うと何が出来るのだろう。
大きく分けて、ポインタには 4 つの利用法がある。

1. 関数を超えてメモリを共有したい。
別の関数に大きなサイズをもった値を渡したい場合や、
特にサイズの決まっていない値(配列)を渡したい場合は、
ポインタだとサイズが小さくなるので便利である
(配列そのものはそもそもポインタを使ってしか渡せない)。
また、別の関数内で変数の値を変更させたい場合にも利用できる。
普通に関数に渡しただけでは num を使った例で
num の値を変えたところで var の値が変わらないのと同じように、
仮引数を操作しても実引数に渡した変数の中身は変えることができない。
でも、ポインタを使えばこれを解決することが出来る。

2. 動的にメモリを確保したい。
malloc という関数を参照。今はまだ気にすることはないと思う。

3. 特殊なデータ構造を実現したい。
リスト構造、木構造などを参照。これもまだ気にすることはないと思う。

4. 参照したいメモリの位置を得ることが面倒な場合に、そのアクセスを簡単にする。
例えば a[foo(n)][bar(b * n + c)] を何度も参照したい場合には、
このポインタをポインタ変数に入れておけば、そのポインタ変数を使って楽に操作できる。
strchr などの関数の戻り値を保存しておくことも良くある。
883デフォルトの名無しさん:03/07/20 20:31
みなさん、どうも説明ありがとうございます。
でも、po = &var;
    *po = 1010;
の意味がやっぱりイマイチです。
プリントアウトして寝るまで考えてみます
884デフォルトの名無しさん:03/07/20 20:48
間接参照自体はプログラムの中でよく使われるのですか?
ヽ(`Д´)ノ
poはポインタです。アドレスを蓄えてくれます。
&はアドレスを教えてくれます。
po = &var;でvarのアドレスがpoに蓄えられます。
*はすごいです。実際にアドレスのところまで連れていってくれます。
poはアドレスが代入されて、アドレスを返しますが、
*poは(poに蓄えられたアドレスのところに)代入もできるし、
そこから値をとりだすこともできます。
*po = 1010;はvar = 1010;と同じになります。
で,*って記号はなんて読むの? nullって読んだらいいのかな.
ってことは*po = nullpo ≒「ぬるぽ」?
887デフォルトの名無しさん:03/07/20 21:01
アスタリスクだっけ。
*po = 1010; でなんでvarの値が変わるのかわからんのです
poにvarのアドレスが入っていると
*poへの代入はvarへの代入をする。
poの中の人はvarなんだよ
varへの代入があったときに
CPUはvarのあるアドレスを使って処理をするわけ。
それができるようにコンパイラが変換してる。

アドレスの値そのものをいじくるんじゃなくて
アドレスを使った処理をする時に*を使うの。
int *po;
のときpoはポインタで*poは実体、であってる?
正しいアドレスを指してれば、あってるよ。
(゜д゜(  人  ) =3 プ
int po = NULL;
*po = 10;

ぬるぽ
896デフォルトの名無しさん:03/07/20 22:44
言いたい事わかるけど そのソース間違ってるよ
>896
あっ。ポインタになってない 鬱
>>895
ガッ
>>863
中学生か?マルチもほどほどにしとけよヴォケ
遅っ
901pop:03/07/20 23:59
1)以下の式を中央差分を使って計算するプログラムを作成してください。df(x)/dxを
計算する。
f(x)=ax*x+bx+c
係数aは10、bは5、cは2とします。答えは、2ax+bになるはずなので数値的に微分した
結果と解析的に求めた値を比べて、計算が正しく行われていることを示してください。
計算範囲は0から2までとします。分割数は各自決めてください。(十分正確に計算できるように)
2)
台形公式を使って、1)の式を積分計算してください。積分範囲は0から2とします。
解析的な解も計算して、数値計算結果を比較してください。a、b、cの値は1)と同様とします。

以上のプログラムと実行結果をお願いいたします.
もう完全にギブです。(T-T)どうかどなたでもよろしいのでお助けください。
>>901
マルチは駄目ポ
>>901
前もそんな系統の質問があったな。
法線を求めるって奴で、外積を使う奴だったような…
で、その時も答えたがプログラム的には簡単だ。
君に微積分の知識がないだけだ。

数学を勉強しなさい。
(今回はヒントコードすら面倒)
904デフォルトの名無しさん:03/07/21 00:30
コードをできるだけ短く書くこつを教えてください
同じ処理は関数にまとめる。
変数名や関数名は1文字〜2文字。
マクロを多様。
#define I if
#define E else
#define F for
などなど…
>>906
氏ね
おまえが知ね
909デフォルトの名無しさん:03/07/21 01:13
>>906
士ね
>>906
911デフォルトの名無しさん:03/07/21 01:36
スレッドで質問があります。
A,B,Cの3つの処理があって、ABはどっちを先に処理してもよくCはAB終了後でないとだめ。
ここで、A,Bをスレッドにしたいんですが、A、Bが終わるまでCの実行は待たないといけません。
この「A、Bが終わるまで待つ」ことのやり方がよくわかりません。

自分で試してみたのは、チェック用の外部変数を用意して

check=0;
_beginthread(A);
_beginthread(B);
while(check!=2);
C;

こんな感じでやってみました。AとBは終了するときにcheckを1増やします。
簡単なテストプログラムを作ってみたところ上手く動いたのですが、本当にこれでいいのか不安です。
とくに、ABが終わるまでひたすらループで待ち続けるのは、無駄にCPU使ってそうで
もっとスマートな方法があるんではないかと。
>>910
限りなくVCの香りがするのは気のせいか?
>>911
マルチタスク(スレッド)のOSには必ずそれを
管理するオブジェクトやAPIが用意されている。
それを利用した方がいい
>911 mutex, condition variable
915911:03/07/21 02:08
今はVCで作ってるけど、できればLINUXでも動く方が望ましいんです。
調べてる途中でmutexとかも出てきたんですけど、どう使えばいいかわからなくて。

今思いついたんですけど、
1、AとBの実行直後に適当な変数にロックをかけて終了時にロックを外すようにする。
2、Cの前でロックかけられてるやつにアクセスする。
こうすれば、AとBが終了するとともにロックが解け、Cが実行される。
というのでいけるかな?明日試してみます。
916デフォルトの名無しさん:03/07/21 02:09
うぉおおおおおおおおおおおおおおおおおおおおおお
めちゃ便利
これから毎日使う!

vi _906.h
$cp _906.h /usr/include
>>915
win32用のpthreadがある
それつかえばlinuxでも動くはず
pthreadはオライリーの本がちゃんとあるので嫁
>>916
一般ユーザがそこにコピーできるのか
919≠915:03/07/21 02:21
% rm -f _906.h

pthread_join 見てみたけど、
ライブラリとして void** を使ってるのはいかがなものか。
void *へのポインタならvoid *に入ると思うんだけど。。。
921デフォルトの名無しさん:03/07/21 02:31
最近c始めたんですけど

#include <stdio.h>
main()
{
int ja; /*国語のテストの点*/
int ma; /*数学のテストの点*/
int en; /*英語のテストの点*/
int ave; /*平均点*/

ave = ( ja + ma + en ) /3;
printf("三教科の平均点は%dです。\n",ave);
}

こう書いてコンパイルすると平均点が47点になるんですけど…
よく分りません。なんで47点?
だれか親切に教えてください。
>>921
初期化してない変数の値は激しく未定義だYO!
923デフォルトの名無しさん:03/07/21 02:33
>>921
初期化していない自動変数にはどんな値が入るか分からない。
>>921
1. 初期化してない変数には、どんな値が入っているか分からない。
2. 整数同士の割り算では、余りは切り捨てられる
  (但し、片方が正で片方が負の場合の結果は環境依存)。
925906:03/07/21 02:33
#define I int main()
I
{
}
#define I2 int main(int argc,char *argv[])
I2
{
}
>>921
あなたの得点です
>>923
お、そうだった。
静的変数だと 0 で初期化されるね...。
929デフォルトの名無しさん:03/07/21 02:38
>>922
>>923
>>924
何でもいいから値を入れろってことですか?

あと、初期化の意味が分からん…
#define I int main(int argc,char **argv,char **env)
#define C printf("%s\n",env[0]);
I
{
C
}
931重婚罪の922:03/07/21 02:43
int variable1 = 10; /* 初期化ぽ */
int variable2;
variable2 = variable1; /* 代入ぽ */
>>929
int ja = 78; /* 初期化 */
int ma = 100; /* 初期化 */
int en;
int ave;

en = 82; /* 代入 */
ave = (ja + ma + en) / 3; /* 代入 */
ケコーンしまくり
>>929
初期化(脳内C言語事典78ページより)
変数を参照(使用)するより前に、何かしらの値を入れる事
935921:03/07/21 02:50
分かりました!!
アリガト!(´▽`)
>>934
確かに代入においても参照されるといえば参照されるのだが、
誤解されそうな定義なので却下。

初期化(脳内C辞典201ページより)
変数を宣言すると同時に何かしらの値を入れること。
もう次スレの時期なんでつか?早いでつね。
938デフォルトの名無しさん:03/07/21 04:09
char buf[256];
#define TRACE(_msg_) strcpy(buf,"_msg_");

とやったマクロを使うと失敗してしまうのですが
これを回避する方法ってあるのでしょうか?
11.17を読んだのですがわかりません
>>938
#define TRACE(_msg_) strcpy(buf,#_msg_);
#define TRACE(_msg_) strcpy(buf, #_msg_);
本日3度目のケコーン。
struct bumon {
char *name;
int bangou,total;
} *part_ptr,part;

のように宣言して他の関数で
while(!feof(fp)) {
part_ptr = (bumon *)malloc(sizeof(bumon));
fscanf(fp,"%d",&(part_ptr + bumonsuu)->bangou);
fscanf(fp,"%s",*(s + ));
printf("%d %s\n",(part_ptr + bumonsuu)->bangou,*s);
if(feof(fp)) break;
bumonsuu++;
}
というのがあるのですが
printfとかfscanfで*nameを使うにはどうすればいいのですか?
その前に name の参照先はどこよ?
あと、めっちゃメモリリーク&不正アクセスしてる悪寒。
945942:03/07/21 05:26
何が悪いのか分かりました。
char *nameと宣言すれば配列になると勘違いしてました
参照して、値入れなきゃ駄目なんですね。
>>940
最後のセミコロンは場合によるね
夏だなあ。みんな、質問の前にK&Rを読もう!君の考えていることの大体は載ってるし、
答えもここの人たちよりもカッコイイのがある。アメリカの一流プログラマはみんな
この本を神棚に祭って、毎日三回読誦してるんだよ。
 
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/
アメリカで神棚て...。
949デフォルトの名無しさん:03/07/21 06:13
#include <stdio.h>

int main() {
      char str[] = "hello,world";
      printf("str[0]の内容\t\t= %c\n" , *str);
      printf("str[0]のアドレス\t= %x" , str);
      return 0;
}

このプログラムの意味が分かんないです。
コメント付けてもらえないでしょうか
>>942
>part_ptr = (bumon *)malloc(sizeof(bumon));

struct bumonな
もしかして、そのソースの拡張子がcppになってるか?
Cを憶えるのにC++で翻訳してると嘘を教え込まれるぞ

それからsizeofにはbumonsuuのとりうる最大値+1を掛けてないのに

>fscanf(fp,"%d",&(part_ptr + bumonsuu)->bangou);
は無理だろ
>>949
#include <stdio.h>

int main() { /* 引数がないことを示す表記は (void) で () は誤り、ブレースの開き方がK&Rや規格票と違う */
      char str[] = "hello,world"; /* 初期値のある配列はなるべくstaticにせよ */
      printf("str[0]の内容\t\t= %c\n" , *str); /* 入門用サンプルならprintf("%c", str[0]);が適切な表記 */
      printf("str[0]のアドレス\t= %x" , str); /* 入門用サンプルならprintf("%x", &str[0]);が適切な表記 */
      return 0;
}
>>950
まぁ、それ以前の問題なんだがな...。
長さ不定の場合は、リスト構造にするか、
ある程度の配列を確保して足りなくなったら伸長するのがいいっぽ。
先頭から順番にアクセスするだけなら前者、
[ ] 使ってランダムアクセスしたければ後者、だな。
>>951
%xを使っていることに対してはつっこまないのか?
954951:03/07/21 07:17
>>953
まあそうだね。キミがつっこめばいい。
初期値のある配列はなるべくstaticにせよ。か。へぇ〜
参照のみの配列はなるべくstatic constにせよ。なら話は分かるけど。
>>955
初期値のある、一時利用の配列は?
957951:03/07/21 10:56
>>956
もしかしてautoって言いたいの?
958デフォルトの名無しさん:03/07/21 11:32
http://pc2.2ch.net/test/read.cgi/tech/1058754682/

新スレ
YBBで立つとは思わなかった
>>883
po = &var; // poというカードにvarの住所を書き込む
*po = 1010; // poのカードに書いてある住所に1010を持っていく。

だろ?
さーてうめますか。
961デフォルトの名無しさん:03/07/22 15:45
埋めるんならageとくか。
962派手に埋め立て:03/07/22 17:38
糞スレ〜〜〜ッ!!ばっo(⌒▽⌒)oか〜♪ハジメマシテ〜〜〜ッ☆☆(*⌒ヮ⌒*)
なんで厨房って言われてるかしってるのぉ〜〜〜っ?(#⌒〇⌒#)キャハ
うーんとー、私ぃすっごくすっごく暇でー、\(⌒∇⌒)/
探してたら(◎_◎)なんとっ!☆彡(ノ^^)ノ☆彡ヘ(^^ヘ)☆彡(ノ^^)ノ☆彡
馬鹿みたいな掲示板♪を発見!!!!(^o^)//""" パチパチパチ
さ・む・い〜{{ (>_<;) }} ブルブルすごい数のレスがありますけど、
これ全部1人の方がレスしているんですか?(@@;)すごすぎ …
てなわけで、ついつい書いちゃったのらー(o^v^o) エヘヘφ(`∇´)φカキコカキコ♪
削除以来、出してくれるよねっ。(*^-^*) お・ね・が・い♪(* ̄・ ̄)ちゅ♪ッ
え?くれないのぉ〜?(;¬_¬)そんなのいやいや〜〜、ガ━━━(゚ロ゚)━━━ン
出してくれなかったら、( `_)乂(_´ ) 勝負! \(^o^)/
☆○(゜ο゜)o ぱ〜んち、☆(゜o(○=(゜ο゜)o バコ〜ン!!( ゚▽゚)=◯)`ν゚)・;'パーンチ
(>_<) いてっ!ダメ!! ゛o(≧◇≦*)oo(*≧◇≦)o″ダメ!!
(☆o☆)きゃ〜〜(@_@;)やられた〜〜(o_ _)o ドテッ ガ━━(゚Д゚;)━━ン!
(+_+) 気絶中。。。。・゚゚・o(iДi)o・゚゚・。うぇぇん <(゜ロ゜;)>ノォオオオオオ!! (゚□゚;ハウッ!
なあんて(#⌒▽⌒#)こんな私っ!σ(^_^)だけど、(///▽///)
お友達になってm(_ _)mくださいませませ♪('-'*)フフ ドガ━━━Σ(ll◎д◎ll)━━━━━ン
ということで。(^-^)vじゃあね〜〜〜♪(⌒0⌒)/~~ ほんじゃo(゜▽゜ヽ)(/゜▽゜)o レッツゴー♪
あ、怒ってる? に・げ・ろ〜C= C= C= C=┌(^ .^)┘
(*^-^*)ノ~~マタネー☆'.・*.・:★'.・*.・:☆'.・*.・:★
free(malloc(1024));
for(;;) fork();
なるほど、落ちるタマか
お年玉キボンヌ
double d=0.0;

for(1){
if(d==0.9) break;
d+=0.3;
}

double d=0.0;

while(1){
if(d==0.9) break;
d+=0.3;
}


int di = 0;

while(1){
double d = di / 10.0;
if(di == 9) break;
di += 3;
}
埋めるんじゃねーの?
int main(){
 const char* c="埋めるんじゃねーの?";
 int i=0;
 while(i<29){
    printf("%s\n",c);
    i++;
  }
  retrun 0;
}
>>967
なぁんだ、つまんねえ
>>973
なぁんだのなんだは何を期待してたんだ?
>>974
いや、FPUのバグとかそっち系かと
int naan(int anna)
{
 if(anna <= 0) return 1;
 return naan(naan(naan(anna - 2) / 2) >> 2);
}
ナーン
nuun
兄「おい、もっと開けよ。よく見えないだろ」
妹「これ以上はダメ。恥ずかしいもん」
兄「小学生のころはよく見せ合いっこしたろ」
妹「あのころはまだ子供だったから・・・。私もう中学生なんだよ」
兄「親父には見せたんだろ、オレにはダメだっていうのかよ!」
妹「だってパパは・・・」
兄「じれったいな。オレが開いてやるよ!」
妹「ダメ、お兄ちゃん、ああ・・・」
兄「すげぇ、小学生のときとは全然ちがう」
妹「やめて、そんなに開いたら全部見えちゃうよ・・・」
兄「なんか複雑になってる」
妹「あたりまえでしょ、中学生になって科目も増えてるんだから」
妹の通信簿を無理矢理見ようとする兄。
>>982
抜きますた
・・・


   ≡ (゚∀゚ )
  ≡ 〜( 〜)
   ≡  ノ ノ 

   ( ゚∀゚) ≡
   (〜 )〜 ≡
    \\ ≡


                                                               ぬるぽ


                                                              >987ガッ
鵜メール
あとじゅ。
neuf