トップページ⇒tech
1001コメント290KB

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2005/05/17(火) 23:32:03
まず問題を冷静に吟味して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/

各種リンク、関連スレは>>2-13あたり

C言語なら俺に聞け! Part 106
http://pc8.2ch.net/test/read.cgi/tech/1113102515/
他の過去ログはここに
http://nssearch.hp.infoseek.co.jp/clang/
0002デフォルトの名無しさん2005/05/17(火) 23:33:48
【コンパイラ】
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
00033様2005/05/17(火) 23:52:52
>>1
乙
0004デフォルトの名無しさん2005/05/18(水) 00:06:02
4ゲト。」いきなりですが
リスト構造を用いて,挿入整列のプログラムを作成せよ
・リスト構造は,ポインタによるリンクリストを用いること
・整列前のリスト内の各要素,整列後のリスト内の各要素を
 表示するようにすること
って課題が出て、配列を使ったリスト表現を作りたいんですが
さっぱりわかりません。ヒントでいいので教えていただけませ
んか?
0005デフォルトの名無しさん2005/05/18(水) 00:07:20
えっと、、配列を使ったリスト、とは?
0006デフォルトの名無しさん2005/05/18(水) 00:22:20
間違えました、リスト構造の変わりに複数の配列を用いて
表現したいんです。すみませんでした。
0007デフォルトの名無しさん2005/05/18(水) 00:22:56
>>4
http://pc8.2ch.net/test/read.cgi/tech/1115794784/359
http://pc8.2ch.net/test/read.cgi/tech/1112968209/635
いいかげんウザい
0008デフォルトの名無しさん2005/05/18(水) 01:03:20
>>4
>>1 に宿題は別スレって書いてあるだろうが。
7 にリンクが貼ってあるが、回答はもう出てる。
0009デフォルトの名無しさん2005/05/18(水) 01:34:36
>>4
リスト構造と配列構造は同時に構築できないんだが。
0010デフォルトの名無しさん2005/05/18(水) 01:39:46
>配列を使った
だから
リストへの挿入時にメモリを配列からアロケートするとかじゃないの
0011デフォルトの名無しさん2005/05/18(水) 03:33:46
typedef type Data ;
typedef struct node {
  Data data ;
  struct node *pre ;
  struct node *next ;
} Node ;

本来リストで処理するところを↓のような配列で処理したいのでは?
まぁ、何にしても俺は答えるつもりはないけど

#define MAX 10
Data data[MAX] ;
0012デフォルトの名無しさん2005/05/18(水) 11:43:48
標準ライブラリのatoi()関数について質問です。

int atoi(char s[])
{
int i, n;

n=0;
for(i=0; s[i]>='0' && s[i]<='9'; ++i) n = 10*n+(s[i]-'0');
return n;
}

の記述で、s[i]>='0' && s[i]<='9' となっていますが、
s[i]が数字か判定するならば'0'<=s[i]<='9'でも、
配列sはchar型であるので良いと思うのですが、
なぜこのような記述をしているのでしょうか。
0013デフォルトの名無しさん2005/05/18(水) 11:49:30
>>12
それ、ちゃんと動くか検証してみたか。
('0'<=s[i])<='9'
こういうことだぞ
0014デフォルトの名無しさん2005/05/18(水) 11:50:40
質問の意味がよくわからん…
0015122005/05/18(水) 11:56:47
>13
数学的に考えすぎてたみたいです。
演算子の優先度をもう少しよく調べてみます。
ありがとうございました。

>14
数学のように、n,a,bが整数だからa<=n<=bでも動作するか(例)、
という事を聞きたかったんです。
0016デフォルトの名無しさん2005/05/18(水) 12:02:45
>>15
13で書いたように、a<=n<=b は
a<=nの結果(0(FALSE)か0以外(TRUE))とbを
比較することになるので意味がない。
0017デフォルトの名無しさん2005/05/18(水) 12:06:25
!0と書くべき、なのか
0018デフォルトの名無しさん2005/05/18(水) 13:18:16
typdedef struct node;
struct node {
  void *data;
  node *next;
} array[10];

ほいよ、配列を使ったリスト構造
一応、メリットとしては途中の要素の削除にmemmoveを使う必要がない
0019デフォルトの名無しさん2005/05/18(水) 13:24:04
それだったら素直に削除フラグでも持たせた方がいいなぁ。
0020デフォルトの名無しさん2005/05/18(水) 13:52:26
削除なんざmemcpyとfreeでいい
0021デフォルトの名無しさん2005/05/18(水) 23:58:52
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
0022デフォルトの名無しさん2005/05/19(木) 00:04:56
>>21
除算や乗算よりはやい、と言われている
アンタがその差が生きるプログラムを書いているかどうかは別だ
0023デフォルトの名無しさん2005/05/19(木) 00:16:07
マスキングで意味あるね
0024デフォルトの名無しさん2005/05/19(木) 00:21:32
またビットシフトかよ
0025デフォルトの名無しさん2005/05/19(木) 00:26:40
ビットシフト飽きた
そろそろ次のやつたのむ
0026マルチプロセス初心者2005/05/19(木) 00:48:33
UNIX系OSにてマルチプロセスプログラミング作っております。
それで、少し問題が・・・・・
fork()を利用して複数のプロセスを同時に起動させて
pipe()を利用して子プロセスから親プロセスへ演算結果を
返すようなプログラムを組んでおります。
それをfor文で一定以上繰り返すと、fork()自体が失敗
するようになってしまいます・・・
これの原因はどこにあるのでしょう?

ex

for( i = 1 ; i <= 100 ; i++ )
{
pid[i] = fork();
if( pid[i] == -1 ) printf("error!\n");

if( pid[i] == 0 )
{
何か色々と処理させる
exit(0);
}
}
wait();


子プロセスが1個起動して終了するまで待つのは効率が悪いので
一気に複数のプロセスを起動させて全てが終わるまで待つようにしてます。
色々と調べてみたんですが、どうしても原因がわからなかったので
どなたかご存知でしたら教えてください。

0027デフォルトの名無しさん2005/05/19(木) 01:17:47
最近のはフォークボム対策がされてるから、フォークできる数に制限がある。
どうしてもやりたいならカーネルを再コンパイルしたらよい。
0028マルチプロセス初心者2005/05/19(木) 08:35:08
>>27
アドバイスありがとうございます。
/etc/security/limits.conf で設定されている nproc を変更してもだめなんですかね?
カーネルリビルドは全然OKなんですが、どこの項目を変更すればよいのやら・・・・
0029デフォルトの名無しさん2005/05/19(木) 10:29:51
>>28
スレ違い。該当OSスレへどうぞ。
0030デフォルトの名無しさん2005/05/19(木) 19:01:40
以下の2つのマクロに意味的に何か違いはありますか?
ただ好みの問題でしょうか?
do { ... } while(0) か { ... } だけかってことなんですが。

#define MACRO1() {\
 var1 = foo; \
 var2 = bar; \
}

#define MACRO2() \
 do { \
  var1 = foo; \
  var2 = bar; \
 } while (0)
0031デフォルトの名無しさん2005/05/19(木) 19:12:11
do while() で途中からbreakで一気に抜けるコードを見たことあるなあ
gotoとかわらん気がスルガ・・・
0032デフォルトの名無しさん2005/05/19(木) 19:50:05
チャットを作っています。
・リストボックスに文字列を書き込む関数
・リストボックスに書いてある文字列を取得する関数
を教えてください!!お願いします!
0033デフォルトの名無しさん2005/05/19(木) 20:04:01
>>31
それはgotoより酷いよう泣きガス。
0034デフォルトの名無しさん2005/05/19(木) 20:13:36
>>32
標準Cにリストボックスはありません。
0035デフォルトの名無しさん2005/05/19(木) 20:17:40
>>30
MACRO1 のほうは、

if (...)
MACRO1();
else
...;

と書けない。
0036デフォルトの名無しさん2005/05/19(木) 20:31:47
マクロをそれ以外の何かのつもりで使おうって思想がそもそも狂ってる
return が関数だとかポインタは配列だとか言い出す痛いトーシロ

アフォの一言で斬るのみ
0037デフォルトの名無しさん2005/05/19(木) 22:59:44
longjmp最高!!
0038デフォルトの名無しさん2005/05/19(木) 23:53:41
double a[8];
a[0] = 0.0;
として、a[0]に0が入らないってどういうこと?
0039デフォルトの名無しさん2005/05/20(金) 00:01:57
>>38
入らなかったことはどうやって確認したのですか?
0040デフォルトの名無しさん2005/05/20(金) 00:11:17
>>38
その後の何かの処理で書き換えた、とか。
0041デフォルトの名無しさん2005/05/20(金) 00:27:00
>>38
それはあなたの脳みそが暴走しています。
0042デフォルトの名無しさん2005/05/20(金) 00:55:13
int型の変数を宣言しても32bit、16bitがあると聞きました。
これを意図的にシステムに依存させずに使い分けるにはどうやって
宣言すればいいでしょうか?
0043デフォルトの名無しさん2005/05/20(金) 01:11:59
>>42
処理系に依存するしかない。
0044デフォルトの名無しさん2005/05/20(金) 01:14:19
if ( sizeof(int)==4 )
{}
0045デフォルトの名無しさん2005/05/20(金) 01:52:10
>>44
sizeof(int)==4 だからといって 32bit とは限らない。
0046デフォルトの名無しさん2005/05/20(金) 02:43:04
typedefすればいいだけの話じゃなくて?
0047デフォルトの名無しさん2005/05/20(金) 03:13:33
stdint.h の
int_leastXX_t
とか
int_fastXX_t
とか
は、
C99、らしい
0048デフォルトの名無しさん2005/05/20(金) 04:20:21
sizeof int が 4 なのに32ビットじゃない環境なんてあるの?
1バイトが8ビットじゃない環境のこと?
0049デフォルトの名無しさん2005/05/20(金) 05:31:16
#include <limits.h>
0050デフォルトの名無しさん2005/05/20(金) 08:36:04
教えてください。
C言語でBMI計算式を書きたいのです。計算式は体重÷(身長×身長)です。
ほとんど初心者なので、一番簡単な計算式でお願いします。
0051502005/05/20(金) 08:45:55
待ってみましたが回答が得られません。
この板の人間は酷すぎます。
詐欺です。
私の接続料金を返してください。
返却なき場合は警察と顧問弁護士に相談します。
0052デフォルトの名無しさん2005/05/20(金) 10:09:42
>>50-51 は割り算掛け算が分からないらしい

bmi = weight / (height * height);
0053デフォルトの名無しさん2005/05/20(金) 10:13:12
いや>>51は騙りだろ、ちょとワラタ
0054502005/05/20(金) 10:29:53
騙りではありません。
失礼な事言わないでください。
割り算掛け算ぐらいわかります。
名誉毀損です。
所轄裁判所に訴えます。
0055デフォルトの名無しさん2005/05/20(金) 10:36:09
急速にスレの質が低下してまいりました
0056デフォルトの名無しさん2005/05/20(金) 11:26:52
('A`)ハァ、面白いと思ってんのかね
0057東大宮2005/05/20(金) 11:42:12
教えていただきたい問題があります。
下のプログラムを実行すると以下の出力が得られた。
値(1)、(2)、(3)を求めよ。

プログラム
---------------------------------------------------------------
#include<stdio.h>

int main(void){
int ai[3]={(1), (2), (3)};
int n;

for(n=0;n<5;n++)
printf("%d,%d\n", n, *(int *)(((char *)(ai+1))-n));
for(n=0;n<2;n++)
printf("%d, %d\n", n, *((short *)(&ai[sizeof(ai)/sizeof(int)-1]+n)));
}

---------------------------------------------------------------

出力結果
--------------------------------------------------------------
0, 1
1, 256
2, 65536
3, 16777216
4, 0
0, -9
1, 9
です。よろしくお願いします!
0058デフォルトの名無しさん2005/05/20(金) 11:46:31
int main(int argc,char** argv)
{
float weight,height;
if(argc != 3) return 0;
weight = atof(argv[1]);
height = atof(argv[2]);
printf("BMI=%f\n", weight / (height*height) );
return 0;
}
0059デフォルトの名無しさん2005/05/20(金) 11:49:11
お前ら釣られるなよ >>50 はコピペだぞ

>>57
スレ違い
宿題スレでも逝け
0060デフォルトの名無しさん2005/05/20(金) 12:03:39
習い始めの教えたがりが釣られてるだけ
0061デフォルトの名無しさん2005/05/20(金) 12:24:34
お前ら釣られるなよ >>61 はコピペだぞ
0062デフォルトの名無しさん2005/05/20(金) 12:26:49
>>40
書き換えてる箇所なんてないのに勝手に
変わるんです。
a[0]=0.0;とした直後は0.0が入っていて
ある行でいきなり変な値が入って・・・。
わけわからん
0063デフォルトの名無しさん2005/05/20(金) 12:34:19
>>62
double a[8];
の前後に一行ずつ追加して、

int dummy1[100];
double a[8];
int dummy2[100];

で、やってみそ。
0064デフォルトの名無しさん2005/05/20(金) 12:38:17
>>62
どこかで領域を破壊している。
配列・ポインタ関連の処理が怪しいとみた。
0065622005/05/20(金) 12:45:41
for(i =0; i<8; i++){
a[i] = 0.0;
}
u_int XX, YY, U_bar, V_bar;
u_int *X, *Y, *u_bar, *v_bar;
X = &XX; Y = &YY; u_bar = &U_bar; v_bar = &V_bar;

X[0] = 355; Y[0] = 435;
X[1] = 747; Y[1] = 429;
X[2] = 747; Y[2] = 453;
X[3] = 355; Y[3] = 458;
X[4] = 97; Y[4] = 281;
X[5] = 889; Y[5] = 256;
X[6] = 882; Y[6] = 326;
X[7] = 10; Y[7] = 347;
というコードにしてて、
X = &XX; Y = &YY; u_bar = &U_bar; v_bar = &V_bar;
をなくすとa[]が書き換えられなくなりました。
どういうことなんでしょうか?
0066デフォルトの名無しさん2005/05/20(金) 12:53:05
> u_int XX, YY, U_bar, V_bar;
> X = &XX; Y = &YY; u_bar = &U_bar; v_bar = &V_bar;
> X[1] = 747; Y[1] = 429;
> X[2] = 747; Y[2] = 453;
> X[3] = 355; Y[3] = 458;
> X[4] = 97; Y[4] = 281;
> X[5] = 889; Y[5] = 256;
> X[6] = 882; Y[6] = 326;
> X[7] = 10; Y[7] = 347;

どこにアクセスしてるんだ?


>>64
的中の様です。
0067デフォルトの名無しさん2005/05/20(金) 12:54:32
>>65
> u_int XX, YY, U_bar, V_bar;

u_int XX[256], YY[256], U_bar[256], V_bar[256];

> X = &XX; Y = &YY; u_bar = &U_bar; v_bar = &V_bar;

X = XX; Y = YY; u_bar = U_bar; v_bar = V_bar;


に直してやってみそ。
0068デフォルトの名無しさん2005/05/20(金) 13:02:25
お前ら釣られるなよ >>38 >>62 >>65 はコピペだぞ
0069デフォルトの名無しさん2005/05/20(金) 13:04:40
構造体struct a{int you;}A;を定義。

A *A1,*A3;
A **A2;

A2 = A1;(参照渡し)
*A3 = A2;(値を渡したい)
で,
A3->youとかやるとエラってしまいます。
DOしたらいいんでしょうか?お願いします。
0070デフォルトの名無しさん2005/05/20(金) 13:07:42
>>69
warning と error 出ないか?
0071デフォルトの名無しさん2005/05/20(金) 13:22:02
>>69
Cに参照渡しはない。
0072デフォルトの名無しさん2005/05/20(金) 13:24:54
>>69
A *A1, *A2, *A3;

A2 = A1; //(参照渡し)
*A3 = *A2; //(値を渡したい)
0073デフォルトの名無しさん2005/05/20(金) 13:24:59
>>65
typedef struct a{int you;}A;

A a;
A *a1, *a3;
A **a2;

a1 = &a;
a2 = &a1;
a3 = *a2;

/* a3->you を使う */
0074692005/05/20(金) 13:40:34
70-73ありがとうございます。
もうしばらく参考にしてがんばってみます。
0075デフォルトの名無しさん2005/05/20(金) 13:52:23
半角カタカナ一文の文字数を全角と
同じように2で返すような関数
など無いですかね?
DBが半角カタカナはニバイトに変換して
しまいましてstrlenだとうまく
文字数チェックできなくて…

携帯からでスマソン
0076デフォルトの名無しさん2005/05/20(金) 14:30:05
>>75
ワイド文字で処理すれば?
0077デフォルトの名無しさん2005/05/20(金) 15:37:26
�@
int i, j;
i = j = 0;

�A
int i, j;
i = 0;
j = 0;

�B
int i = 0, j = 0;

�@�A�Bは全部同じ実行速度でしょうか?
0078デフォルトの名無しさん2005/05/20(金) 15:46:12
int main(){
char a[10] = "0x96";
char b = 0x00;

b = ((char)(a[2] - '0') << 4) ;
printf("b=%x\n",b );
b = b | (a[3] - '0');
printf("b=%x\n",b );
}

・実行結果
b=0xffffff96

文字列”0x96”から16進数の0x96に変換したいんですけど、なんかないでしょうか?
aの値は0x00〜0xffを予定しています。
いまの 「- '0'」の処理がだめなのはわかってますが、なんで実行結果に「ffffff」入るのかさっぱりわからないです。
0079デフォルトの名無しさん2005/05/20(金) 15:48:17
コンパイラによります
0080792005/05/20(金) 15:57:18
>>77
0081デフォルトの名無しさん2005/05/20(金) 15:58:46
>>79
なるほど。
有難うございました。
0082デフォルトの名無しさん2005/05/20(金) 15:59:03
>>78
bはcharじゃなくてunsigned charにしないと負になってしまいますよ
0083デフォルトの名無しさん2005/05/20(金) 16:01:09
>>82
これで基礎部分ができました、ありがとうございます。
0084デフォルトの名無しさん2005/05/20(金) 16:01:21
>>78
符号拡張している
strtoul を使うのが一番手っ取り早い、
isdigit と isxdigit とtoupper 等を
組み合わせて自分でやるのもそんなに手間じゃない
0085842005/05/20(金) 16:11:11
printf("%#lx\n", strtoul(a, NULL, 16)); // => 0x96
0086デフォルトの名無しさん2005/05/20(金) 16:16:14
>>85
おおおおお、1関数じゃないですか。
なるほどstrtoul()ってこういう使いときに使えるのですね。

ありがとうございます。
0087デフォルトの名無しさん2005/05/20(金) 17:31:53
関数の引数に const char *hoge のように const を付けているのを良く見るのですが、
この意図は何なのでしょうか?
0088デフォルトの名無しさん2005/05/20(金) 17:35:45
>>87
ポインタが指してる先の内容を変えないという宣言
0089デフォルトの名無しさん2005/05/20(金) 17:43:33
>>88
なるほど。
念の為に付けておくと安心ですね。
有難う御座いましたm(_ _)m
0090デフォルトの名無しさん2005/05/20(金) 18:25:23
windowsXPでC言語のプログラムを作って実行する環境を作りたいのですが、
どうすればいいでしょうか?テンプレは英語のサイトばっかりで頭こんがらがってます。
0091デフォルトの名無しさん2005/05/20(金) 18:29:57
ネット上の英語すら読めない頭なら諦めれ
0092デフォルトの名無しさん2005/05/20(金) 18:33:54
>>90
>>1-2
google
0093デフォルトの名無しさん2005/05/20(金) 18:34:09
>>86
printf("0x%lx\n", strtoul(a, NULL, 16));

としないと、値が0の際0xが表示されなかったりするので注意。
0094デフォルトの名無しさん2005/05/20(金) 18:34:13
>>90
タダで使えるBorland C++ Part4
http://pc8.2ch.net/test/read.cgi/tech/1091066805/
0095デフォルトの名無しさん2005/05/20(金) 19:30:09
簡単な質問ですいません。
環境変数を列挙する方法を教えてください。
mainの仮引数を利用する方法と関数を利用する
方法があった気がするのですが、思い出せません。

>>93
幅4を指定したほうがスマートな気がします。
(といっても、今コンパイラも入ってない状態で値0の時の
確認もできんのですけど、、)
0096デフォルトの名無しさん2005/05/20(金) 19:36:02
>>95
環境依存。
0097デフォルトの名無しさん2005/05/20(金) 19:36:05
int main(int c, char **v, char **envp);

0098デフォルトの名無しさん2005/05/20(金) 19:53:41
>>96
依存でしたか・・・。
>>97
ありがとうございます。mainの方ですね。
(これも標準ではないからあんまり載ってないのでしょうか)
ただいまいち使い方がわかりません。
for(; ; ) if (*envp) puts(*envp++);
でいいのでしょうか。インストールしたら確認してみます。
有り難うございました。
0099932005/05/20(金) 20:11:40
>>95
残念ながらそれでは駄目です
010095,982005/05/20(金) 21:42:50
>>99
BCBインストールしました。
>>98は駄目ですね。なんで終了しないのか5分も悩みました・・・
for(; ; ) if (*envp) puts(*envp++); else break;
無限ループでした、、、アホだ>俺

0x00の表示は、
int i=0;long j;
char a[][5]={"0x00","0x99","0xff",NULL};
for (;i<=0xFF;i+=0x01) printf("%#04lx ", i);
for(i=0;*a[i];i++){
sscanf(a[i],"%lx",&j);
printf("strtoul:%#04lx sscanf:%#04lx \n", strtoul(a[i], NULL, 16) ,j);
}
BCBだとこれでいいみたいですけど、他の環境では駄目なんですか?
0101デフォルトの名無しさん2005/05/20(金) 21:52:10
>>100
NULLは無効なポインタをあらわすために使うものだからchar配列にNULLは入れられない。
その直後のforはなぜインクリメント演算子を使わないんだ。

あと、envpのループはこうでいいだろ。
while (!*envp)
    puts(*envp++);
0102デフォルトの名無しさん2005/05/20(金) 22:14:28
NULL=0
0103デフォルトの名無しさん2005/05/20(金) 22:27:04
>>102
たしかにそう定義されている場合もあるが、意味論としてはchar配列にNULLを入れるのはやはりおかしい。
0104デフォルトの名無しさん2005/05/20(金) 22:33:48
>>100
NULL と '\0' と "" の区別ができてない奴のコードは見ればわかる
例え動いても単位は出せない
010595,982005/05/20(金) 22:35:42
>>101
部分部分書き直して色々試した残骸が残っていたようです、、。
NULLは""に直したつもりだったのですが、・・・NULLでも動作
してて気づきませんでした。
010695,982005/05/20(金) 22:47:36
char* a[]={"0x00","0x99","0xff",NULL};
for(i=0;a[i];i++)
こういう形から書き換えてて、混乱した結果です。
急いで投稿しようとしてミスりました(うぅ・・)
0107デフォルトの名無しさん2005/05/20(金) 22:55:56
ケアレスで済むことと済まないことがある
たとえ二軍でも腐ってもプロ野球選手が打って左へ走ったりはしない
それほどのことだ
0108デフォルトの名無しさん2005/05/20(金) 23:15:42
sizeof演算子って、コンパイル時に大きさが決まってないもののの
大きさも求められるの?
0109デフォルトの名無しさん2005/05/20(金) 23:21:12
>>108
C99の可変長配列なら問題ない。
0110デフォルトの名無しさん2005/05/20(金) 23:32:03
いやコンパイル時に決まってなきゃ無理だろ
0111デフォルトの名無しさん2005/05/20(金) 23:32:41
ああ、そういう意味か。
それは可能か
0112932005/05/21(土) 04:27:41
>>100
当方VC++6.0だが、ダメ。0x0でも0x00でもなく0000と表示される。
0113デフォルトの名無しさん2005/05/21(土) 15:06:44
#
o、x、X の各書式と一緒に使用すると、0 以外のすべての出力値の前にそれぞれ 0、0x、または 0X が付きます。 空白は表示されません。
e、E、f の各書式と一緒に使用すると、出力値には必ず小数点が付きます。 後続の数字がある場合だけ小数点が付きます。
g 書式または G 書式と一緒に使用すると、出力値には必ず小数点が付き、後続する 0 は切り捨てられません。
後続の数字がある場合だけ小数点が付きます。後続の 0 は切り捨てられます。
c、d、i、u、または s のいずれかと一緒に使用すると、このフラグは無視されます。

ってマイクロソフトのやつにはかいてある
0114デフォルトの名無しさん2005/05/21(土) 15:11:19
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
0115デフォルトの名無しさん2005/05/21(土) 15:25:33
>>114
いつかわかる。それまで辛抱しろ。
0116デフォルトの名無しさん2005/05/21(土) 15:38:31
またビットシフトが来たよ('A`)
0117デフォルトの名無しさん2005/05/21(土) 16:31:49
トークンについての質問ですが
struct token{
enum{NUM,ADD,SUB,MUL,DIV}type;
int value;
};
(各定数は左から数、加算、減算、乗算、除算)
という様に規定した場合、関数内での変換方法は
int i;
if(i=='+')'+'=ADD;
かもしくは
int i;
'+'=ADD;
で良いのでしょうか?
0118デフォルトの名無しさん2005/05/21(土) 17:05:57
>>114
ビットシフト→お前
0119デフォルトの名無しさん2005/05/21(土) 17:11:20
int i=0;long j;
char a[][5]={"0x00","0x99","0xff",NULL};
for (;i<=0xFF;i+=0x01) printf("%#04lx ", i);
for(i=0;*a[i];i++){
sscanf(a[i],"%lx",&j);
printf("strtoul:%#04lx sscanf:%#04lx \n", strtoul(a[i], NULL, 16) ,j);
}

このように掲示板などに貼られた文章をcygwin・viで貼り付ける場合には
どのようなコマンドを打てばいいのでしょうか?
コピペのやり方がわかりません・・・。
0120デフォルトの名無しさん2005/05/21(土) 17:12:03
>>117
激しく意味がわからないが、'+'=ADD; はコンパイルエラー。
0121デフォルトの名無しさん2005/05/21(土) 17:12:41
>>119
スレ違い。
0122デフォルトの名無しさん2005/05/21(土) 17:39:23
>>119
OMANKOtyu-tyu-♪
0123デフォルトの名無しさん2005/05/21(土) 18:45:49
ファイルから読み込んだデータを配列に格納するには、
どうやるのですか?

例えば、

ads 213 g
asd 765 h
のファイルで、

fp=fopen("aaaa.txt",r);
while((c=getc(fp)!=EOF){

の後の処理なんですが。
お願いします。
0124デフォルトの名無しさん2005/05/21(土) 18:48:19
ファイルはテキストなの?
行に分かれてるならfgetsとsscanfでよくね?
0125デフォルトの名無しさん2005/05/21(土) 18:56:26
>>124
テキストです。
ただ、scanf系を使わないで処理したいんですよ。
0126デフォルトの名無しさん2005/05/21(土) 19:00:49
atofやstrcpyじゃ駄目なの?
0127デフォルトの名無しさん2005/05/21(土) 19:04:02
>>126
できれば、標準関数を使わないでやりたいです。
かなり、面倒なやり方になるとは思うのですが。
0128デフォルトの名無しさん2005/05/21(土) 19:07:49
>>120
俺が知りたいのは
enum{NUM,ADD,SUB,MUL,DIV}type; ←トークンの種類
int value;          ←トークンの値
とした場合のトークンの種類の使い方が知りたいんです。 
0129デフォルトの名無しさん2005/05/21(土) 19:20:48
>>123
fscanf が嫌いなら、気の済むような関数作ったら?

何のために C 使ってるのか忘れた奴をこの業界ではアフォと言う
たかが fscanf 程度の関数ごとき作れない者には廃業以外の選択はない
0130デフォルトの名無しさん2005/05/21(土) 19:23:04
ヘッダーファイルで、
typedef struct tagObject
{
 int x;
 int y;
}OBJECT;
OBJECT Obje_01[OBJECT_MAX];
このように構造体を定義して、
各ソースファイルからこれを使用するにはどうしたらいいでしょうか。
このヘッダーファイルを各ソースからインクルードすると、
多重定義になってしまいます。

ご教授お願いいたします。
0131デフォルトの名無しさん2005/05/21(土) 19:24:24
typedef struct tagObject
{
 int x;
 int y;
}OBJECT;
extern OBJECT Obje_01[];
0132デフォルトの名無しさん2005/05/21(土) 19:30:10
>>131
返答ありがとうございます。
extern を付けましたが、以下のようなリンクエラーになってしまうのです。
外部シンボル ""struct tagObject * Obje_01" (?Obje_01@@3PAUtagObject@@A)" は未解決です
今は2つのソースファイルがこのヘッダーをインクルードしています。
もしかして、原因は他にあるのでしょうか。
0133デフォルトの名無しさん2005/05/21(土) 19:33:41
>>132
関数と同じようにただ1つのソースファイルで実体定義すれ
0134デフォルトの名無しさん2005/05/21(土) 19:57:28
>>133
main.cppの方で実態定義し、sub.cppの方でexternを使っての定義をしたところ
正常にコンパイルできました。
これでいいですか?
0135デフォルトの名無しさん2005/05/21(土) 20:50:06
>>134
宣言と定義を混同していると単位貰えない
0136デフォルトの名無しさん2005/05/21(土) 21:12:12
牛肉が食べたいです。
よろしくお願いします。
0137デフォルトの名無しさん2005/05/21(土) 21:15:31
スペイン語で牛肉を何というか調べてみなさい
それは日本語であなたを指す言葉と発音が似ています
0138デフォルトの名無しさん2005/05/21(土) 21:23:39
カルネ?
0139デフォルトの名無しさん2005/05/21(土) 21:27:00
>>135
ありがとうございました。
1つ前進することができました。
0140デフォルトの名無しさん2005/05/21(土) 21:30:11
>>137は牛肉じゃなくて牛をスペイン語でなんというか調べてみなさい
それは日本語であなたを指す言葉と発音が似ています
0141デフォルトの名無しさん2005/05/21(土) 21:31:56
>>140はにんにくをスペイン語でなんというか調べてみなさい
それは日本語であなたを指す言葉と発音が似ています
0142デフォルトの名無しさん2005/05/21(土) 21:34:20
>>143は馬鹿を日本語でなんというか調べてみなさい
それは日本語であなたを指す言葉と発音が似ています
0143デフォルトの名無しさん2005/05/21(土) 22:37:40
プログラムの実行速度を計る方法は無いでしょうか?
プログラムが終了した時点で、実行にかかった速度を表示させたいです。
0144デフォルトの名無しさん2005/05/21(土) 22:54:27
>>128
自分で考えるとおりのコードを書け。
0145デフォルトの名無しさん2005/05/21(土) 22:54:48
>>143
#include <time.h>
0146デフォルトの名無しさん2005/05/21(土) 23:01:54
安いよ!!
http://page6.auctions.yahoo.co.jp/jp/auction/f34841613
0147デフォルトの名無しさん2005/05/21(土) 23:07:54
>>143は>>142にぴったりのレスだなぁ
0148デフォルトの名無しさん2005/05/21(土) 23:09:08
time ./a.out
0149デフォルトの名無しさん2005/05/21(土) 23:14:28
実行時に引数として与えられた数だけ配列を作成したいのですが、
配列の作成に変数が使えないので困っています。
どうすれば良いでしょうか。
0150デフォルトの名無しさん2005/05/21(土) 23:16:15
>>149
質問は、入門書を読み終わってからでも遅くは無いだろう?
0151デフォルトの名無しさん2005/05/21(土) 23:17:09
>>143
プロファイラ使えとスレ違いのレスをしてみるテスト
0152デフォルトの名無しさん2005/05/21(土) 23:18:02
>>149
入門書でmallocを探してみろ
ないなら買え
0153デフォルトの名無しさん2005/05/21(土) 23:21:50
malloc を?
0154デフォルトの名無しさん2005/05/21(土) 23:24:30
>>149
C99対応のコンパイラを使え。
古いCは配列の要素数に変数を指定できない。
0155デフォルトの名無しさん2005/05/21(土) 23:27:00
>>153
そこはさすがに察してくれよ・・・
0156デフォルトの名無しさん2005/05/21(土) 23:32:11
>>153
warata
0157デフォルトの名無しさん2005/05/22(日) 00:17:20
関数の引数に配列を入れる場合についての質問です。

void function(char);

int main(void){

char init[10];
function(init[10]);
return 0;
}

void function(char a[ ]){
functionの処理
}

のようにすると、エラー
10: 'function' の再宣言で型が一致していない
1: 一つ前の 'function' の定義位置

となってしまいます。どのように変えればうまくコンパイルできるでしょうか?
0158デフォルトの名無しさん2005/05/22(日) 00:17:39
高機能版mallocを開発したら、売れるかな?
0159デフォルトの名無しさん2005/05/22(日) 00:25:41
>>157
一体どこからつっこんでいいのかわからない
0160デフォルトの名無しさん2005/05/22(日) 00:32:57
>>157
釣りだよな?
0161デフォルトの名無しさん2005/05/22(日) 00:54:43
>>157
> void function(char);
> void function(char a[ ]){

どうして宣言と定義の仮引数の型が違うんだ?
揃えろ。
0162デフォルトの名無しさん2005/05/22(日) 00:57:24
void function(char a[ ]){

int main(void){

char init[10];
function(init[10]);
return 0;
}

void function(char a[ ]){
functionの処理
}
0163デフォルトの名無しさん2005/05/22(日) 00:57:30
> char init[10];
> function(init[10]);

( ゚д゚) …
0164デフォルトの名無しさん2005/05/22(日) 01:00:05
Cの宣言シンタクスの問題だよなあ

>>157には

char a[]
の型はcharで名前がa[]に見えるんだろう
だから両者の違いがわからない

Cの宣言は左にも右にも書かれるから
この場合は
名前がaで型は char []なんだよな

Javaではシンタクス改められてるけど
0165デフォルトの名無しさん2005/05/22(日) 01:03:45
> 名前がaで型は char []なんだよな

型は char* だろ
0166デフォルトの名無しさん2005/05/22(日) 01:05:20
( ゚д゚) …
0167デフォルトの名無しさん2005/05/22(日) 01:06:09
はいはいクマクマ
0168デフォルトの名無しさん2005/05/22(日) 01:06:51
たまにはこういうのもいいな
0169デフォルトの名無しさん2005/05/22(日) 01:08:14
Intel in it!
0170デフォルトの名無しさん2005/05/22(日) 01:15:23
型が不一致なのでエラー
function(&init[10]);
と渡すとエラーにはならないことがたぶん保証されているのでエラーにはたぶんならない
0171デフォルトの名無しさん2005/05/22(日) 01:19:59
>>170
こちらへどうぞ
http://pc8.2ch.net/test/read.cgi/tech/1115386557/
0172デフォルトの名無しさん2005/05/22(日) 01:22:13
void function(char *a){

int main(void){

char init[10];
function(init);
return 0;
}

void function(char *a){
functionの処理
}


〜 終 了 〜
0173デフォルトの名無しさん2005/05/22(日) 01:30:05
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
0174デフォルトの名無しさん2005/05/22(日) 01:33:02
C言語を始めたばかりでもわかりますが、
ビットシフトは役に立ちますよね
0175デフォルトの名無しさん2005/05/22(日) 01:36:22
>>172
オマエモナー
http://pc8.2ch.net/test/read.cgi/tech/1115386557/
0176デフォルトの名無しさん2005/05/22(日) 01:48:47
>>175 >>175
0177デフォルトの名無しさん2005/05/22(日) 02:00:34
急速に(ry
0178デフォルトの名無しさん2005/05/22(日) 02:05:36
>>173
ビットをシフトするのに役立つ
0179デフォルトの名無しさん2005/05/22(日) 02:09:50
トートロジー
0180デフォルトの名無しさん2005/05/22(日) 02:16:12
>>179
恒真命題
0181デフォルトの名無しさん2005/05/22(日) 02:56:06
質問です。
複数のバラバラに並んだ自己参照構造体配列を、宣言、初期化したあと。
チェーンのつなぎ変えによってソートするには、どう書けばいいんでしょうか?
struct Kouzou {
int x;
struct Kouzou *next;};
で、kouzou[100]={{0,},{1,},{2,},[6,},{21,},{3,}・・・・・・・・
と、延々つづく構造体を、
大きい数から順にチェーンのつなぎかえで、最後に、
for (ip=stert;ip->next!=NULL;ip=ip->next)
printf ("%d\n",ip->x);
で一覧表示したいのですが・・・
構造体配列のコピーや移動でソートするのではなくて、チェーンの
つなぎ変えの記述を教えて下さい、お願いします。
0182デフォルトの名無しさん2005/05/22(日) 03:01:42
>>181
カプセル化されていない線形リストは無限ループが紛れ込む危険があるのでお勧めできない。
宿題なら宿題スレへ。
0183デフォルトの名無しさん2005/05/22(日) 03:11:20
ありがとうございます。
宿題ではありません。
もう4日くらいこれで止まってしまってます。
だれか・・・・
0184デフォルトの名無しさん2005/05/22(日) 03:11:46
>>182
何故この程度でカプセル化?
何故C言語でカプセル化??
何故勝手に宿題板行き???
0185デフォルトの名無しさん2005/05/22(日) 03:16:24
つなぎ換えのとき、交換するようにすればいいだけなのでは
0186デフォルトの名無しさん2005/05/22(日) 03:35:54
for(ip=stert;ip->next!=NULL;ip=ip->next){
  if(ip->x<ip->next->x)
    if(ip==stert)stert=ip->next;
    tmp=ip->next;
    ip->next=ip->next->next;
    tmp->next=ip;}
これでいけると思ったんですが、
教えていただけないでしょうか?
0187デフォルトの名無しさん2005/05/22(日) 03:37:12
繋ぎ換えって元々繋がってないジャン
0188デフォルトの名無しさん2005/05/22(日) 03:39:25
イケルと思ったんなら実行してみておかしなところを見直せばいいジャン
0189デフォルトの名無しさん2005/05/22(日) 03:43:16
stertって何?
0190デフォルトの名無しさん2005/05/22(日) 03:47:47
a=>bの間にc=>d=>eのdを入れるなら

temp=a.next
a.next-=c.next
c.next=d.next
d.next=temp

forは2重になるでしょ
0191デフォルトの名無しさん2005/05/22(日) 03:54:04
いえ、当然繋がっているものとしてです、初期化の後。
for (y=0;kouzou[x].next!=NULL;y++)
kouzou[x].next=&kouzou[x+1];で、
つなげてます。書いてませんでした、すいません。
最後尾のポインタにNULLもつけています。
教える気が無いのはいいんですが、ヒントだけでも下さい。
0192デフォルトの名無しさん2005/05/22(日) 03:54:08
挿入ソートやった方が早いし速いのに
0193デフォルトの名無しさん2005/05/22(日) 03:56:17
ベビベビベイビベイビベイビベイビベイベー
0194デフォルトの名無しさん2005/05/22(日) 04:00:52
ポインタの配列作ってqsortに渡せば?
ソート済みポインタ配列の順に繋げば?
0195デフォルトの名無しさん2005/05/22(日) 04:01:14
190さんありがとうございます。
だいぶ自分のバカさを晒してしまいましたが、
要するに自己参照構造体の理解が足りないだけのようです。
もうすこし悩みます。では。
0196デフォルトの名無しさん2005/05/22(日) 04:02:16
挿入ソート。
struct Kouzou *ListSort(struct Kouzou *data)
{
struct Kouzou root = { 0, NULL }, *n, *r;

while(data)
{
n = data;
r = &root;
data = data->next;
while(r->next)
{
if(r->next->x > n->x)
break;
r = r->next;
}
n->next = r->next;
r->next = n;
}
return root.next;
}
...
stert = ListSort(stert);
0197752005/05/22(日) 04:09:33
>>76
ありがトン!さっそくワイド文字列でコーディングしてみます。
今、環境が無いのですが、charからワイドにコピーする場合は
普通にstrcpyで出来るでしょうか?
ANSI Cを使用してます。
0198デフォルトの名無しさん2005/05/22(日) 04:19:05
196さん、194さんも、ありがとうございました。
196の内容は、ありがたいんですが、正直意味が解りませんでした。
ヒントも理解できないとは・・・
自分で解るまで考えますわー。今度こそさいならー。
0199デフォルトの名無しさん2005/05/22(日) 04:19:23
>>197
mbtowc()
0200デフォルトの名無しさん2005/05/22(日) 04:28:34
ごめん

>>197
mbstowcs() だった
0201デフォルトの名無しさん2005/05/22(日) 04:29:25
>>198
リストをソートしようとするから面倒になる
一度、リストを分解して、各ノードに分けてから
規則的(大きい数から順になるよう)にノードを追加すれば良い
02021972005/05/22(日) 04:31:47
>>199、200
有難うです。さっこくコーディングして
月曜にコンパイルして確認してみます。
めっちゃ助かりましたヾ(´ー`)ノ
02031962005/05/22(日) 04:41:04
> if(r->next->x > n->x)

if(r->next->x < n->x) だったorz
0204187,188,1902005/05/22(日) 06:55:35
>>191
ネタもいいけど
聞かないと教えられないんだけど
わざわざ繋げるんなら繋ぎ換えなんてことしなくて
a=>bの間にcを入れるだけなんだから

c.next=a.next
a.next=&c

で済むでしょ
cのための外側のforとどこに入れるか探すための内側のfor(while)でできるジャン
0205デフォルトの名無しさん2005/05/22(日) 09:05:21
単にファイルの存在を調べたいときは、皆さんは access 関数と stat 関数の
どっちをつかいますか?

マニュアルに access 関数はセキュリティホールの元になるという記述が
あるのですが、ファイルの存在を調べるだけなら関係ないですよね?
0206デフォルトの名無しさん2005/05/22(日) 09:08:02
環境に適した方法で。
0207デフォルトの名無しさん2005/05/22(日) 09:13:35
俺はfopenの成否でファイルの存在を調べる
0208デフォルトの名無しさん2005/05/22(日) 09:18:24
"w"にはするなよ
0209デフォルトの名無しさん2005/05/22(日) 09:46:00
俺はaccessの方が多少は軽い可能性があると思って、積極的にaccessにしてるが
「そういえばどっかでセキュリティ問題を聞いたような気がしないでもない」と思い、
"access セキュリティホール"でぐぐってみたら
結果はご想像の通り。

accessもstatも、「標準C」の話題じゃないけどな。
02102052005/05/22(日) 10:03:56
失礼しました。環境はFreeBSDです。確かに標準Cの話ではないですね。

いま書いているプログラムが、書き込み先が存在していたら別の名前の
ファイルを作って書きこめという仕様なもので…
とりあえずaccessでやってみていますが、いろんなソースコードをみると
statが成功するか失敗するかで判定しているコードが多いので、どうしてか
と思って205を書きました。

access関数のセキュリティホールですが、どうもaccessでパーミッションを
調べてからおもむろにopenするようなプログラムは、acccess呼び出しと
open呼び出しの時間差をついた攻撃ができるらしいです。単にファイルの
有無を調べるだけなら関係ないような気もしますが。

# accessとセキュリティホールでぐぐるとMS Accessの話ばかりで… 
0211デフォルトの名無しさん2005/05/22(日) 11:45:32
>a=>bの間にcを入れるだけなんだから

>c.next=a.next
>a.next=&c

ワロタ
0212デフォルトの名無しさん2005/05/22(日) 11:55:38
>>211は、何がおかしいのか
オレにも説明してくれないか

ずっと悩んでたのに簡単にできたから?
0213デフォルトの名無しさん2005/05/22(日) 12:02:54
もまえの脳内では aとbの間なんだねプププ
0214デフォルトの名無しさん2005/05/22(日) 12:05:53
a.next に &b が入ってる
それを c.next に入れてるが、何か?
0215デフォルトの名無しさん2005/05/22(日) 12:12:56
頭が悪いと何にでも笑えて羨ましいな
0216デフォルトの名無しさん2005/05/22(日) 12:29:58
まぁ好意的に解釈すれば、a.nextに&bが入っているかどうかは保証されないかもしれないので
c.next=&b
の方が、、、ってことかな?

でも aとbとc の3つが出てくる必要があるからなんだかなぁ
0217デフォルトの名無しさん2005/05/22(日) 13:17:53
>>204
>>186と>>191の方法で、考えてみた?
c以降も繋がってるのだから、元々のc.nextの値を
b.nextに入れないで、どうするの?
>>191(>>198)が分かってないのは、挿入ソートという考え方で、
その説明を端折ったら、>>204の説明は全く検討違いだし、
そうでないなら、>>204の説明は、ただのネタとしか思えんが?
0218デフォルトの名無しさん2005/05/22(日) 13:35:22
教えてください。

今、非常に激しくうんこがしたいのですが、そうするとケ・セラ・セラという言葉の
意味もわからないし、ぬるぽで動きません。

ありがとうございました。
0219デフォルトの名無しさん2005/05/22(日) 13:38:40
>挿入ソート

もともとソート済みの列に、新しい要素を1つづつ挿入していくのが、挿入ソートだろ?
>c以降も繋がってるのだから、元々のc.nextの値を
どゆこと?
0220デフォルトの名無しさん2005/05/22(日) 13:40:12
>>219
>>186と>>191の方法は挿入ソートではない
0221デフォルトの名無しさん2005/05/22(日) 13:41:39
>>219
> もともとソート済みの列に、新しい要素を1つづつ挿入していくのが、挿入ソートだろ?

>>196 ではそうしてるだろ。
0222デフォルトの名無しさん2005/05/22(日) 13:45:43
>217

>>>196 ではそうしてるだろ。
ってゆってるよw
0223デフォルトの名無しさん2005/05/22(日) 13:48:36
お前らよくこんな問題をそこまで引っ張れるな
0224デフォルトの名無しさん2005/05/22(日) 14:02:05
そこでビットシフトの登場ですよ
0225デフォルトの名無しさん2005/05/22(日) 14:09:53
>>219&&221
>>192で一度挿入ソートって単語が出てきて、
さらに、>>196で挿入ソートのサンプルを見てるにも関わらず、
>>198で理解できてないのだから、>>204の
>わざわざ繋げるんなら繋ぎ換えなんてことしなくて
>a=>bの間にcを入れるだけなんだから
って言い方は、どっちを向いても見当違いって事
0226デフォルトの名無しさん2005/05/22(日) 14:11:47

int n = 1000000000;
for( int i = 0; i<=32; ++i )
{
printf( "%8x, %8x\n", n>>i, n<<i );
}
0227デフォルトの名無しさん2005/05/22(日) 14:12:59
しまった・・・orz
Cはforの中で変数宣言しちゃダメジャン・・・。
0228デフォルトの名無しさん2005/05/22(日) 14:15:15
>>226
ネタ乙
0229デフォルトの名無しさん2005/05/22(日) 14:17:38
>変数宣言
C99ならおけでつが、何か?
0230デフォルトの名無しさん2005/05/22(日) 14:37:10
つくづく実社会に受け入れられていない規格だな
0231デフォルトの名無しさん2005/05/22(日) 14:39:35
今更C99に対応してもね…
0232デフォルトの名無しさん2005/05/22(日) 14:46:56
C06辺りで日本語を移植性が高く扱えるようにして欲しいのですが・・・
どうなんでしょう、小泉さん
0233デフォルトの名無しさん2005/05/22(日) 14:56:11
昔も今も C に求めているものは高機能ではなく
言語まわりの開発力が手薄なベンダでも何とかサポートできる程度の簡潔さだ
それと高い表現力との両立がバカウケしたのをどこの唐変木が勘違いしたのやら・・・
0234デフォルトの名無しさん2005/05/22(日) 14:57:08
s/表現力/移植性/
0235デフォルトの名無しさん2005/05/22(日) 15:34:12
世の中からC言語がなくなれば、
バグの60%はなくなるはずだ。
0236デフォルトの名無しさん2005/05/22(日) 15:36:36
世の中からC言語がなくなれば、
世界の平均気温が0.5℃上がるはずだ。
0237デフォルトの名無しさん2005/05/22(日) 15:36:51
>235
その統計はおかしいな
C言語がなくなったとしても他の言語に書き換えるバグはへらない
0238デフォルトの名無しさん2005/05/22(日) 15:43:30
世の中からC言語がなくなれば
2chのム板の書き込みが半減するはずだ
0239デフォルトの名無しさん2005/05/22(日) 16:02:56
リストのソートならマージソートで、と今更ながら言ってみる。
0240デフォルトの名無しさん2005/05/22(日) 16:03:46
Cで文字列の長さ求める方法ってNULL文字調べるしか方法ないの?
0241デフォルトの名無しさん2005/05/22(日) 16:05:08
>>240
それ以外では文字数を別に管理するしかない。
0242デフォルトの名無しさん2005/05/22(日) 16:06:34
>>241
それどうやるの?
0243デフォルトの名無しさん2005/05/22(日) 16:08:01
>NULL文字
NUL文字だね
0244デフォルトの名無しさん2005/05/22(日) 16:10:33
ASCIIではnull characterをNULと表記するけど
null characterは正しい用語だよ

大文字でNULLと書いちゃうと、null pointerを表すNULLマクロに見えるから
誤解されやすいだろうけど
0245デフォルトの名無しさん2005/05/22(日) 16:12:50
>>242
「全ての」文字列をchar*とsize_tあたりのセットで管理すれば?
もちろんリテラルなどというものは使わない(w
0246デフォルトの名無しさん2005/05/22(日) 16:12:56
>>242
struct str {
char *p ; /* 実体も適当に確保してね */
size_t len ; } ;
あとはstr同士を使う時は、lenを使えばOK
最初にpの実体の長さが分からない時は'\0'を探す必要があるけど…
0247デフォルトの名無しさん2005/05/22(日) 16:19:39
CString使えばいいじゃん
0248デフォルトの名無しさん2005/05/22(日) 16:20:25
>CString
Cですか?それ
0249デフォルトの名無しさん2005/05/22(日) 16:21:03
C言語だからね
0250デフォルトの名無しさん2005/05/22(日) 16:21:55
>>249は>>247に対しての発言
0251デフォルトの名無しさん2005/05/22(日) 16:23:57
C言語かと思ったよ
ついでにDelphiなどのPascal系はサイズと領域のペアで管理してるな
0252デフォルトの名無しさん2005/05/22(日) 16:37:09
>>240
そこで言う「文字列」とは、どのようなデータ構造を言うんだ?
ラスタやベクタで文字列の形を表しているのか、文字または文字列に対応する数値を導入しているのか、
その数値は計算に直接使うことを考慮しているのか、入力装置の特性に合わせた仕様のものか、
記憶装置上でどのような配置順になっているのか、C はいかようにも表現しうる言語だ
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ただ唐突に文字列と言われても客体が曖昧すぎて何を聞かれても答えようがない
0253デフォルトの名無しさん2005/05/22(日) 16:49:27
博識ぶった低脳が粘着してるな
つ§7.1.1 用語の定義
0254デフォルトの名無しさん2005/05/22(日) 16:52:41
>246
ばかだな、そんなややこしいことしなくても
str[0] に文字数格納して、文字列を str[1] から開始すればいいんだよ。
0255デフォルトの名無しさん2005/05/22(日) 16:56:32
文字数がcharサイズに収まらなかったらどうするべ
0256デフォルトの名無しさん2005/05/22(日) 17:00:05
さすがに1byteじゃ少なすぎるだろ
0257デフォルトの名無しさん2005/05/22(日) 17:01:28
そこでshortの出番だな

ショートマン参上う
0258デフォルトの名無しさん2005/05/22(日) 17:01:56
>>253
おい小僧、質問者はライブラリでとも strlen とも言ってねえぜ
文字列の表現を1つまたはほんの数例知っているだけなヒヨッ子が高脳ならあんたが高脳、うん偉い
0259デフォルトの名無しさん2005/05/22(日) 17:09:17
>おい小僧、質問者はライブラリでとも strlen とも言ってねえぜ
>文字列の表現を1つまたはほんの数例知っているだけなヒヨッ子が高脳ならあんたが高脳、うん偉い
前文も後文も意味不明すぎなわけだが
0260デフォルトの名無しさん2005/05/22(日) 17:17:04
意味不明
↑
この図形であんたが何を表しているのか容易に推定できたぜ
わかりゃいいんだよ
0261デフォルトの名無しさん2005/05/22(日) 17:26:00
>>260
意味不明な文章を書くのはやめようよ
0262デフォルトの名無しさん2005/05/22(日) 17:30:18
はいはい、一度でいいよw
0263デフォルトの名無しさん2005/05/22(日) 17:34:24
i = i++;
ってC言語じゃやっちゃいけないことになってるが
これって 未定義 なだけだよね。

こういうときの副作用の働き方を 定義 する動きは
コンパイラ作ってる人たちのあいだに無いの?
0264デフォルトの名無しさん2005/05/22(日) 17:38:27
>>262
一度でいいよって…まさか同一人物だと勘違いしてる?
0265デフォルトの名無しさん2005/05/22(日) 17:42:34
>>263
ない
副作用完了点に関する曖昧さは意図的なものだから
それが問題になる場合はアセンブラを使うべき
0266デフォルトの名無しさん2005/05/22(日) 17:43:10
>>264
ということにしたいのですね
0267デフォルトの名無しさん2005/05/22(日) 17:44:25
初心者ですみません
「i++」と「++i」の違いがよくわかりません
0268デフォルトの名無しさん2005/05/22(日) 17:44:35
>>265
なぜ曖昧にしてるんだっけか

コンパイラの設計や最適化方法の妨げになる可能性があるから?
0269デフォルトの名無しさん2005/05/22(日) 17:47:55
>>267
前者は式の評価後に淫クリ
後者は評価前に淫クリ
0270デフォルトの名無しさん2005/05/22(日) 18:09:01
>>267
つまりこういうこと。
int a = 5, b = 5;
printf("%d %d\n", a, b);
printf("%d %d\n", ++a, b++);
printf("%d %d\n", a, b);
0271デフォルトの名無しさん2005/05/22(日) 18:28:22
int up(){ static int hoge=0; return hoge++; } という関数があったとき
if( up() < up() ) printf("unko\n"); else printf("chinko\n");
これはどうなるの?式の評価順序ってなんか法則あるの?
FAQ読んだけどよくわかんね
0272デフォルトの名無しさん2005/05/22(日) 18:30:00
>>266
はぁ…取り付くシマも無いか…
0273デフォルトの名無しさん2005/05/22(日) 18:39:08
PlaySoundでメモリ上からwavファイルを再生しているんですが、
ウィンドウがアクティブのときは普通に再生されます。
アクティブから非アクティブになったときでも普通に再生され続けます。
しかし非アクティブからアクティブに戻ると、一番始めに戻って再生されてしまいます。
ウィンドウがどの状態でも、始めに戻らず再生され続けるにはどうしたら良いですか?
0274デフォルトの名無しさん2005/05/22(日) 18:43:42
変数の値の入れ替えには
もう一つ作業用の変数を使う方法がありますが、
余分な変数を使わない方法はないでしょうか?
02752742005/05/22(日) 18:46:09
すいません。思いつきました。
お騒がせしました
0276デフォルトの名無しさん2005/05/22(日) 18:49:07
>>274-275
http://www.dd.iij4u.or.jp/~okuyamak/Information/xor_fixed_swapping.html
02772742005/05/22(日) 18:54:11
>>276
私が考えたのは3処理でできます。
作業領域を使った場合と速度は一緒っぽいです。

あと、そんな方法を考えていた理由は
値交換のマクロを作るためです。
0278デフォルトの名無しさん2005/05/22(日) 18:59:02
>>277
276の示したページでは作業用の領域を使えば2命令で済む可能性があると書いてあるだろ。
0279デフォルトの名無しさん2005/05/22(日) 19:22:25
>>277
値交換はマクロでなく、実装した方が良いよ。一瞬で作れるんだし…
引継ぎに失敗すると、インクリメント等で、訳の分からんバグを生む事もあるし…
あと、値の入れ替え程度の速度が本気で気になる場合は、
諦めて、その部分だけ、アセンブリ言語使うべし。
C言語の範疇で、一律に早くする交換する方法なんてないから。
0280デフォルトの名無しさん2005/05/22(日) 19:25:06
>>277
マクロで作業用に変数を使いたいときにはdo { } while(0)

C99ではinline関数が使えるし、VC/BCCでは__inlineが代わりとしてある。
02812742005/05/22(日) 19:38:56
>>276,278-280
すいません。
>>276のリンク先はほとんど読んでませんでした。
ちなみに私が考えたのは
x+=y
y=x-y
x=x-y
でした。
inlineとかdo{}whileはまだ勉強していないので調べて見ます。
ありがとうございました
0282デフォルトの名無しさん2005/05/22(日) 19:43:23
>>281
do { } while (0)は#defineと組み合わせて使う。
http://www.kouno.jp/home/c_faq/c10.html#4
0283デフォルトの名無しさん2005/05/22(日) 20:00:43
>>281
XORを使うのよりさらにひどいな・・・
0284デフォルトの名無しさん2005/05/22(日) 20:28:11
do{}while(0) と {} はどこが違うの?
0285デフォルトの名無しさん2005/05/22(日) 20:29:50
;
0286デフォルトの名無しさん2005/05/22(日) 20:31:50
>>284
説明読めよ・・・
0287デフォルトの名無しさん2005/05/22(日) 21:46:10
計算時間の計測について質問です。
#include <time.h>
#include <stdio.h>
int main(void)
{
clock_t start,end;
long l;
start = clock();
for (l=0; l<100000000;l++);
end = clock();
printf("%f\n",(double)(end-start)/CLOCKS_PER_SEC);
return 0;
}
以上の様に書いたところ、きちんと結果が出ました。(0.9秒程)
そこで、forの部分をソート処理に置き換えたところ、
結果が0.000000と返ってきます。
ソート処理は行われています。(printfして確認済み)
どうしたらよいでしょうか。
0288デフォルトの名無しさん2005/05/22(日) 21:58:41
>>287
どうもしなくていい
0289デフォルトの名無しさん2005/05/22(日) 22:18:53
>>287
l の、定数との比較や加算が1回当たり何秒かかっているか調べておき、
「ソート処理」ではそれが何回になっているのかから、どのくらいの結果が出れば妥当かを求めてみれ
log なんたらではなく、具体的な入力内容に対する正確な期待値をだぞ
0290デフォルトの名無しさん2005/05/22(日) 22:19:03
#define A 10
#define B 20
#define C A+B

int main()
{
int a[C];
}

みたいにするとエラーが出るのですがどうすればいいのでしょうか?
0291デフォルトの名無しさん2005/05/22(日) 22:23:23
>>290
C99対応のコンパイラ使え。
0292デフォルトの名無しさん2005/05/22(日) 22:24:58
>>290
ん、問題なさそうに見えるが?
本当に通らないんなら、操作方法か使っているコンパイラが原因じゃないか?
0293デフォルトの名無しさん2005/05/22(日) 22:25:24
>>291

C99を使わないとすると動的に確保するしかないですか?
0294デフォルトの名無しさん2005/05/22(日) 22:25:30
特にエラーは出ないな。
0295デフォルトの名無しさん2005/05/22(日) 22:26:05
まず問題を冷静に吟味して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/
0296デフォルトの名無しさん2005/05/22(日) 22:26:32
>>293
291 は煽りか完全ヴァカ
相手にするな
02972912005/05/22(日) 22:27:25
自分で何とかします
スレ汚しすいませんでした
0298デフォルトの名無しさん2005/05/22(日) 22:32:40
>>290
C99対応でなくともエラーは出ない、と思う。
コンパイル時に配列数は決定できるわけだし。
0299デフォルトの名無しさん2005/05/22(日) 22:35:26
そんなコンパイラ窓から投げ捨てたほうが良いな
意外と別なところに問題があるかもしれないからよく見直して見ることをオススメする
0300デフォルトの名無しさん2005/05/22(日) 22:40:21
質問時に、内容を単純にしすぎて問題が出なくなってるんじゃないかな
0301デフォルトの名無しさん2005/05/22(日) 22:45:36
>>290
きっと#include<stdio.h>がないからだよ!!
0302デフォルトの名無しさん2005/05/22(日) 22:46:59
>>301
果たしてそうかな?
0303デフォルトの名無しさん2005/05/22(日) 22:47:26
>>301
ワロスw
0304デフォルトの名無しさん2005/05/22(日) 22:47:39
ネタニマジレ(ry
0305デフォルトの名無しさん2005/05/23(月) 00:25:15
http://tool-ya.ddo.jp/2ch/trash-box/file/20050522223502265.txt
↑のプログラムはFord-Fulkersonのアルゴリズムで、
(http://coconut.sys.eng.shizuoka.ac.jp/gn/resume11.pdf 参照)
幅優先探索を利用して最大フローを求めているものなのですが、
これを深さ優先探索を利用したプログラムに変更するには
どう変更すればいいのでしょうか?

評価する関数を作って最小の増大路を求めるプログラムに
しようとしたんだけど、結果が出てこなくてうまくいかず・・・
http://tool-ya.ddo.jp/2ch/trash-box/file/20050518233531212.txt = Filtering Processing
0306デフォルトの名無しさん2005/05/23(月) 00:29:13
マルチか誤爆か
0307デフォルトの名無しさん2005/05/23(月) 00:29:29
>>305
マルチ氏ね
0308デフォルトの名無しさん2005/05/23(月) 01:04:40

  ∧∞∧   ┌───────
  (*‘ー‘)   < シラナイワ
   \ <     └───/|───
    \.\______//
      \       /
       ∪∪ ̄∪∪
0309デフォルトの名無しさん2005/05/23(月) 01:14:09
>>290
BOOST_PP_ADD
0310デフォルトの名無しさん2005/05/23(月) 01:20:26
>>290
そんなコンパイラ捨ててしまえ
0311デフォルトの名無しさん2005/05/23(月) 12:16:52
すみません、ビット演算で質問なのですが、

ある変数の値が一つだけビットが立ってることを検査したいのですが
どういう方法が考えられますでしょうか?

例えば、00000100 は◯。00011000 は×。1110000 は×。00000001は◯。
といった具合です。
ぐるぐる回しながらひとつづつシフトして、立ってるビットの数を調べ
るしかないでしょうか。
0312デフォルトの名無しさん2005/05/23(月) 12:23:13
2^nか調べれば?
03133112005/05/23(月) 12:31:10
>>312
ありがとうございます。
具体的には2^nで割算して余りが0になるようにすれば良いでしょうか?
するとやはりこの「n」をぐるぐる回すしか無いでしょうか?
03143122005/05/23(月) 12:33:00
>>313
2で割った余りが0かどうか判定すればいい
03153112005/05/23(月) 12:37:00
>>314
ありがとうございます。でもそれは違うような気もします。
00000110は2で割り切れてしまいます.
0316デフォルトの名無しさん2005/05/23(月) 12:39:32
・・・・・・

そんなにループがいやなのか
0317デフォルトの名無しさん2005/05/23(月) 12:42:07
たかだか8個とか16個とかだろ?switchで一撃書けばええやん?
0318デフォルトの名無しさん2005/05/23(月) 12:43:24
>>315
あ、ホントだ'`,、('∀`) '`,、
君の言うとおり2^nの剰余を、nをインクリメントさせながら求めていく方法しか思いつかないや
スマン
03193112005/05/23(月) 12:43:53
math.hでlog()使って調べることにしました。ありがとうございました皆様。
0320デフォルトの名無しさん2005/05/23(月) 13:00:06
>>311
i&&!(i&(i-1))
0321デフォルトの名無しさん2005/05/23(月) 13:04:57
>>320
0101 とかはどうするんだね。

>>319
log() 使うくらいならループ回した方が速い気もするが…。
0322デフォルトの名無しさん2005/05/23(月) 13:10:39
x==pow(2,n)
0323デフォルトの名無しさん2005/05/23(月) 13:11:40
右シフトして1になってる数をカウントするのが早いかも
0324デフォルトの名無しさん2005/05/23(月) 13:18:41
右に1ずつシフトして、2で割って余りが2個以上出たらアウトでいいんじゃない?
0325デフォルトの名無しさん2005/05/23(月) 13:18:51
シフトってどういうときに使うのですか?
0326デフォルトの名無しさん2005/05/23(月) 13:21:32
>>325
シフトしたいとき
0327デフォルトの名無しさん2005/05/23(月) 13:23:39
>325
大文字にするときじゃないの?
0328デフォルトの名無しさん2005/05/23(月) 13:30:50
>>325
・2^n倍するときや2^nで割りたいとき
・1つの値から特定の数ビットを切り出したいとき
・複数の値を1つの値にまとめたいとき
0329デフォルトの名無しさん2005/05/23(月) 13:59:33
>>325
営業時間が長いとき
0330デフォルトの名無しさん2005/05/23(月) 14:53:12
初心者です。教えてください。

UNIXではファイル更新日付が現在時刻より半年を経過すると
時刻の値が消えてしまうのですが。
Cの関数にstatというファイル情報取得が行える便利なものがあったと思うのですが
この関数をUNIX内で動かした場合、時刻の消失を回避できる結果がえられますでしょうか?

0331デフォルトの名無しさん2005/05/23(月) 15:00:19
>>330
> UNIXではファイル更新日付が現在時刻より半年を経過すると
> 時刻の値が消えてしまうのですが。

え?そうなの?lsコマンドだけの話じゃないの?
ls --full-time で確認するとそんなことなさそうだけど。
0332デフォルトの名無しさん2005/05/23(月) 15:00:26
>>330
半年ルールはlsっていうコマンドがそういう挙動なだけです。
stat()ではちゃんとした時刻が取れます。
0333デフォルトの名無しさん2005/05/23(月) 15:30:05
面倒なことに、ftpもls使ってるから時刻が落ちるんだよな。
03343302005/05/23(月) 15:37:26
>>331
solarisの10以降だったら問題ないのですが
当方環境が古いため、full-timeでは取得できないようです。

>>332
ありがとうございました。半年で時刻が落ちるのは当方環境のlsの
出力仕様のようですね。一度UNIXでstatサンプルをコンパイルしてみます。
03353202005/05/23(月) 15:42:55
>>321
ちゃんと0になるよ。

サンプルコード(1つだけビットの立ってる数値のみ表示する)
#include<stdio.h>
int main(void){
  int i;
  for(i=0;i<256;++i)
    if(i&&!(i&(i-1)))
      printf("%3d\n", i);
  return 0;
}
0336デフォルトの名無しさん2005/05/23(月) 16:33:26
というかK&Rぐらい嫁と
0337デフォルトの名無しさん2005/05/23(月) 17:07:56
お前らはなんでもかんでも釣りだとかネタとか言って決めつけるけど
ビットシフトの話題だけはもう触れるな
0338デフォルトの名無しさん2005/05/23(月) 17:24:18
ソラリス8だけど
/usr/ucb/lsだと、gidが表示されないけど
他はもんだいありません。
/usr/xpg4/bin/lsというのも、あります。
coreutilsの"gls"というのも、たぶん、あります。

$ /usr/bin/ls -ltr /etc | head
total 544
-rw-rw-rw- 1 root sys 1136 2月 13 1998 fddi.cfg
-r-xr-xr-x 1 bin bin 168 12月 8 1999 css.conf*
-rw-r--r-- 1 root sys 1393 1月 6 2000 dacf.conf
-rwxr-xr-x 1 root sys 2623 1月 6 2000 bootrc*
-rw-r--r-- 1 root sys 2303 1月 6 2000 ttydefs
-rw-r--r-- 1 root sys 496 1月 6 2000 rpld.conf
-rw-r--r-- 1 root sys 54 1月 9 2000 motd
-rw-r--r-- 1 root sys 1087 7月 10 2000 inittab
-r--r--r-- 1 root bin 10922 5月 25 2001 magic
03393302005/05/23(月) 17:42:07
>>338
レスありがとうございます。 coreutilsのインストールで
時刻まで取れる オプションがあるようですね。
そちらの線でも調べてみます。

ちなみに以下のサンプルコードを作成しコンパイル&テストしてみました。
結果なのですが、touch コマンドで更新日付を強制的に変更した場合
正常に結果が返るのですが、touchを使わず、本当にその時期に更新されたと
思しき古いファイルを取得すると2005年代のでたらめな値が返りました。
どこかコードで見直す場所がありましたらご指摘お願いします。
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
void main( int argc , char *argv[] )
{
struct stat buf;
int result;
char buffer[] = "A line to output";
result = stat(argv[1], &buf );
if( result != 0 )
perror( "情報取得失敗" );
else
{
printf( "サイズ : %ld\n", buf.st_size );
printf( "更新時刻 : %s", ctime( &buf.st_atime ) );
}
}
0340デフォルトの名無しさん2005/05/23(月) 17:49:35
> void main( int argc , char *argv[] )

int(ry
0341デフォルトの名無しさん2005/05/23(月) 17:49:43
>>339
st_atime じゃなくて st_mtime でしょ?

続けるようならUNIXプログラミングスレッドかUNIX板へ行きましょう。

0342デフォルトの名無しさん2005/05/23(月) 17:54:33
三角形の面積を求める関数をつくったのですが、期待通りの答えが返ってきません。
必ず、128という答えがかえってきます。どうすれば適切な答えが返るようになるのでしょうか。
ちなみに、OSはWin98、コンパイラはBCCです。

#include<stdio.h>

int sankaku(int,int);
int main()
{
int teihen,takasa,menseki;
menseki=sankaku(teihen,takasa);
printf("底辺を入力して下さい。---");
scanf("%d",&teihen);
printf("高さを入力して下さい。---");
scanf("%d",&takasa);
printf("三角形の面積は%dです。",menseki);

return 0;
}

int sankaku(int teihen,int takasa)
{
int menseki;
menseki=teihen*takasa/2;
return menseki;
}
0343デフォルトの名無しさん2005/05/23(月) 17:55:41
底辺と高さを入力する前に計算してどーするっ
03443302005/05/23(月) 18:01:11
>>340
ご指摘ありがとうございます。voidは誤りでしたか。すみません。
修正いたします。


>>341
ありがとうございます。というかスレ違いだったのですね。
今後は移動します。すみません。ありがとうございました。
0345デフォルトの名無しさん2005/05/23(月) 18:34:31
int numofbits5(long bits) {
    bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
    bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
    bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
    bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
    return (bits & 0x0000ffff) + (bits >> 16 & 0x0000ffff);
}
0346デフォルトの名無しさん2005/05/23(月) 18:55:10
>>345
冗長

int numofbits5(long bits) {
    bits -= bits >> 1 & 0x55555555;
    bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
    bits = bits+(bits>>4) &0x0f0f0f0f;
    bits += bits >> 8;
    return bits + (bits >> 16) & 0xff;
}
0347デフォルトの名無しさん2005/05/23(月) 18:57:35
longが32ビットでない環境のことも思い出してあげてください。
0348デフォルトの名無しさん2005/05/23(月) 19:05:27
int の値を 3 桁ごとにカンマで区切って文字列にする方法を教えてください。
03493482005/05/23(月) 19:15:45
待ってみましたが回答が得られません。
この板の人間は酷すぎます。
詐欺です。
私の接続料金を返してください。
返却なき場合は警察と顧問弁護士に相談します。
03503482005/05/23(月) 19:22:59
>349 は自分じゃないです・・・
0351デフォルトの名無しさん2005/05/23(月) 19:26:31
まあ、349はコピペだけどな
ていうか>>348は他のスレでも見た気がするのだが流れてきたのか?
03523482005/05/23(月) 19:30:12
>>351
すみません、他のスレってどこですか?
0353デフォルトの名無しさん2005/05/23(月) 19:33:25
Win32APIあたり
03543482005/05/23(月) 19:39:43
>>353
自分じゃないです。
読んでみましたが結論出てないですよね。
sprintf でできるんですか?
ヘルプ見ても載ってないです。
0355デフォルトの名無しさん2005/05/23(月) 19:57:03
>>348
再帰が楽じゃないか?
0356デフォルトの名無しさん2005/05/23(月) 19:57:40
sprintfを使うと楽だが一発では無理
0357デフォルトの名無しさん2005/05/23(月) 20:30:31
ある数字の下3桁は、その数字を1,000で割った剰余に等しい。
さらに元の数字を1,000で割ると、1,000〜100,000の桁が下三桁に来るので、同様に切り出せる。
あとはこれを被除数側が1,000を下回るまで繰り返せばいい。
負の数とかの細かい話は適当に。

原始的だが、この辺が定石。
スマートな方法を探すのもいいが、泥臭い方法だって別に良いだろ。
0358デフォルトの名無しさん2005/05/23(月) 20:31:41
スタックを使って、ABC DEFと入力すると、
CBA FEDと入力されたものが逆に出力されるようなプログラムを組みたいのですがどうすればよいでしょうか?
FED CBAと出力するなら簡単なのですが・・・。
おそらくスペースが入力されると一旦スタックの中をすべて取り出したらいいと思うのですが、
どうプログラムを組めばいいのか分かりません。
宜しくお願いします。
0359デフォルトの名無しさん2005/05/23(月) 20:32:04
桁数が判ってりゃ一発だが。
03603512005/05/23(月) 20:35:25
疑った償いにと考えてみたのだがあまりにも芋な方法なので出すのがためらわれる
0361デフォルトの名無しさん2005/05/23(月) 20:42:03
>>358
とりあえず内容と長さを普通にスタックに保持して、取り出すときに逆にするというのはどうか
0362デフォルトの名無しさん2005/05/23(月) 20:43:30
質問です。
ファイルから、fgetcで読み込んだデータを、
条件に応じて、配列に格納、宣言するやり方を教えてください。

例えば、数字だったらこの配列。
英字だったらこの配列にといった事です。
お願いします。
0363デフォルトの名無しさん2005/05/23(月) 20:46:21
>>362
うーん、普通に1文字ずつ調べていくしかないのでは
03643582005/05/23(月) 20:55:43
>>362
それだとうまくいかないのですよね・・
0365デフォルトの名無しさん2005/05/23(月) 21:10:07
>>362(*f[])(),*d,*a;
main() {
register c,fp,dm[4096],am[4096],EOF = (-1);
d = dm;
a = am;
fp = fopen(__FILE__, "r");
while((c = fgetc(fp)) != EOF) f[c](c);
fclose(fp);
while(--d >= dm) putchar(*d);
putchar('\n');
while(--a >= am) putchar(*a);
puts("\a");
exit();
}
df(c) { *d++ = c; }
af(c) { *a++ = c; }
nf(c) { }
(*f[])() = {
#define x nf,nf,nf,nf,nf,nf,nf,nf,nf,nf,nf,nf,nf,nf,nf,nf,
x x x
df,df,df,df,df,df,df,df,df,df,nf,nf,nf,nf,nf,nf,
nf,af,af,af,af,af,af,af,af,af,af,af,af,af,af,af,
af,af,af,af,af,af,af,af,af,af,af,nf,nf,nf,nf,nf,
nf,af,af,af,af,af,af,af,af,af,af,af,af,af,af,af,
af,af,af,af,af,af,af,af,af,af,af,nf,nf,nf,nf,nf,
x x x x x x x x
#undef x
};
0366デフォルトの名無しさん2005/05/23(月) 21:28:56
>>360,>>348

char * addStringFromIntWithComma(char * buf, int val)
{
char * p;

if (val < 0) {
p = strchr(buf, '\0');
p[0] = '-';
p[1] = '\0';
return addStringFromIntWithComma(buf, -val);
}
if (val >= 1000) {
p = addStringFromIntWithComma(buf, val / 1000);
return p + sprintf(p, ",%03d", val % 1000);
}
p = strchr(buf, '\0');
return p + sprintf(p, "%d", val);
}

void putStringFromIntWithComma(char * buf, int val)
{
buf[0] = '\0';
addStringFromIntWithComma(buf, val);
}
03673602005/05/23(月) 21:34:23
ちなみに私のはこんなん

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

int main(void)
{
  int i,j,k,n = -1111222333;
  char str[16];

  for(i=0,j=0,k=(n<0)?-n:n;k;i++,k/=10)
    j+=sprintf(str+j,(i%3==2)?"%1d,":"%1d",k%10);
  if(n<0) sprintf(str+j,"-");
  strrev(str);

  puts(str);

  return 0;
}

しょぼ。strrevは大抵のコンパイラにくっついてるけど非標準だから
無かったら作って。
32bitのintならstrは16あれば足りるはず。
おいちゃんはこんな芋な方法しか思いつかんかったんよ…。
0368デフォルトの名無しさん2005/05/23(月) 21:38:53
>>367
しょぼいって言うか、無理しすぎ。肩の力を抜けば>366くらいは簡単でしょうが。
で、>366がstrlen()を使わない件について。
0369デフォルトの名無しさん2005/05/23(月) 23:16:57
この CGI ってどうやるの?
http://blog.livedoor.jp/friend_go_777/archives/22746581.html
0370デフォルトの名無しさん2005/05/23(月) 23:19:29
液晶画面で強めにやると逝ってしまわれるな。
0371デフォルトの名無しさん2005/05/23(月) 23:20:02
>>348
個人的にprintf()系や除算を使う回数が多いのは嫌いなので適当に…
試してないので、動かなかったらスマソ

void foo ( char *ptr, int n ) {
int flag, len, rem ;
flag = ( n < 0 ) ;
len = sprintf( ptr, "%d", n ) - flag ;
rem = len % 3 ;
len /= 3 ;
ptr[ len * 4 + rem + flag ] = '\0' ;
while ( len -- ) {
  ptr[ len * 4 + rem + 3 + flag ] = ptr[ len * 3 + rem + 3 + flag ] ;
  ptr[ len * 4 + rem + 2 + flag ] = ptr[ len * 3 + rem + 2 + flag ] ;
  ptr[ len * 4 + rem + 1 + flag ] = ptr[ len * 3 + rem + 1 + flag ] ;
  ptr[ len * 4 + rem + flag ] = ',' ; }
return ; }
0372デフォルトの名無しさん2005/05/23(月) 23:20:25
>>369
CGI 使ってないしスレ違い
0373デフォルトの名無しさん2005/05/23(月) 23:29:58
>>371
・・・・・・
コーディングはスマートにって教わらなかったか
0374デフォルトの名無しさん2005/05/23(月) 23:41:33
俺もそう思った
0375デフォルトの名無しさん2005/05/23(月) 23:46:07
>>371
>printf()系や除算を使う回数が多いのは嫌いなので
ループの回数が無駄に多い罠。
0376デフォルトの名無しさん2005/05/23(月) 23:51:45
バランス感覚の欠如が printf どころじゃないね
0377デフォルトの名無しさん2005/05/24(火) 00:20:37
int comma カンマ
で、ぐぐる
0378デフォルトの名無しさん2005/05/24(火) 00:31:02
>>348
適当。
size_t seps(char *buffer, int n)
{
  size_t len;
  if (n < 1000) {
    sprintf(buffer, "%d", n);
    return strlen(buffer);
  }
  len = seps(buffer, n/1000);
  sprintf(buffer + len, ",%03d", n%1000);
  return len + 4;
}
0379デフォルトの名無しさん2005/05/24(火) 00:54:07
ほんとだぁ、すっげぇ適当だぁ
0380デフォルトの名無しさん2005/05/24(火) 00:58:40
文字列反転させて先頭からカンマ打ってくのが普通のやり方だと思ってたけど
そういうサンプルが出ないね。珍しいやり方なんだろうか
0381デフォルトの名無しさん2005/05/24(火) 01:01:55
>>380
>>367
まさにそのまんまじゃねーか
03823712005/05/24(火) 01:07:59
>>373-376
別に、文句言われる程悪いとは思わないけどね…
まぁ、実際にCをコンパイルできる環境が目の前にないので、
個人的に分かりやすいようにコードを書いたのは確かだが…
取り合えず、ある程度、まとめてみた
前回同様、試してないので、動かなかったらスマソ

void foo ( char *p, int n ) {
int i ;
p += i = sprintf( p, "%d", n ) ;
p[i=(i-(n<0)-1)/3] = '\0' ;
while(i--) p -= 3, p[i+3] = p[2], p[i+2] = p[1], p[i+1] = *p, p[i] = ',' ; }
0383デフォルトの名無しさん2005/05/24(火) 01:12:50

      /⌒'\
      ( ,i::::::::::::i  ./⌒\
       〉ノ:::::::::::|  | ○゜ i ) )
      /;/:::::::::::」/.〉   /   
  ___.i;;.i::::::::::::i/ ..: .',  /
./ ヾ  .|;;i:::::::::::/..   ..;;〉.」  
.__ .\|;.i:::::::::/ /  ...;;/
  _ノ\i_) i:::::::/   ...;;/ //    具にするよ〜
 ̄    .|; i:::::/ /  ..;;/ 
  __.|;_i::/   ...;;/
  ___/  .....;;/ 
     .|;; i  ...;;イ
     ノ;; ,.‐ ;;-.;i
   /;;; /' ''   ;;;X 
   |;;  ;i;;.. 〜  ;;|
   X〜 ;i;;; ;;,. ;;;/
    ヽ;;__\_;;/
0384デフォルトの名無しさん2005/05/24(火) 01:13:34
非再帰で書くにしても何で長さを求めるのに sprintf なの?
添え字の使い方も相変わらず要領得てないし・・・
03853832005/05/24(火) 01:14:11
すみません間違えました。
0386デフォルトの名無しさん2005/05/24(火) 01:15:29
>>384
sprintf()した後にstrlen()を呼ぶ意味を見出せないから
0387未確認2005/05/24(火) 01:16:33
void foo(int dat, char *str) {
  int isminus = 0;
  int buf;
  int kbuf = 1;
  int cnt = 1;
  int i;
  char* pin = str;

  if(dat < 0) {
    buf = dat * -1;
    isminus = 1;
  }else{
    buf = dat;
  }
  if(buf < 1000){
    sprintf(str, "%d", dat);
    return;
  }
  while(1) {
    if(buf / kbuf < 10) break;
    kbuf *= 10;
    cnt++;
  }
  if(isminus) *pin++ = '-'
  for(i = cnt; i >= 0; cnt--) {
    *pin++ = '0' + (buf / kbuf) % 10;
    if(i % 3 == 0) *pin++ = ',';
    kbuf /= 10;
  }
}
0388デフォルトの名無しさん2005/05/24(火) 01:17:08
そんなこと聞いてない
p で隠してる邪悪さのことだ
0389デフォルトの名無しさん2005/05/24(火) 01:17:12
やけにみんな乗り気だなこの問題
0390デフォルトの名無しさん2005/05/24(火) 01:17:36
>>388 は >>386 宛て
0391デフォルトの名無しさん2005/05/24(火) 01:20:47
>>390
何が邪悪なの?
0392デフォルトの名無しさん2005/05/24(火) 01:24:53
>>391
とぼけるんなら話は終わりだ
0393デフォルトの名無しさん2005/05/24(火) 01:29:55
>>392
とぼけるも何も特に罠を張ったつもりはないし
>>382で書いてあるように今現在環境がないので
テバッガで追う事も出来ない(コンパイルが通るかすら検証出来ない)
邪悪だと思われる処理があったら教えてくれ
0394デフォルトの名無しさん2005/05/24(火) 01:31:26
>>393
バッファ長をどうするかに動作確認は関係ない
0395デフォルトの名無しさん2005/05/24(火) 01:32:37
さあ、盛り上がってまいりました
0396デフォルトの名無しさん2005/05/24(火) 01:35:22
>>394
ハァ?
何を言いたいの?
0397デフォルトの名無しさん2005/05/24(火) 01:36:48
>>396
ここは学校じゃないんで
それは教えてやらない
金払うなら別だが
0398デフォルトの名無しさん2005/05/24(火) 01:36:50
つーか、机上デバッグもできてないコードを書ける神経を疑うね。
どう考えたって>382が動くわけがないし、汚いロジックだと思わないんだとしたら終わってるよ。
0399デフォルトの名無しさん2005/05/24(火) 01:44:00
>>398

>つーか、机上デバッグもできてないコードを書ける神経を疑うね。
別に仕事じゃないからね

>どう考えたって>382が動くわけがないし、汚いロジックだと思わないんだとしたら終わってるよ。
どこら辺で「動くわけがない」と判断してるか良く分からんが
>>382にも「動かなかったらスマソ」って書いてあるじゃん
それに、この問いに対する回答としては別に汚いロジックではないよ
まぁ、俺のコードの書き方が汚いのは認めるが、考え方は別に間違えてないし
0400デフォルトの名無しさん2005/05/24(火) 01:44:43
まったく!、汚ねぇロジックだ。
0401デフォルトの名無しさん2005/05/24(火) 01:49:16
テキストファイルを読みこんで、行を読みとばす方法はfgetsってことでよろしいんでしょうか?
たとえば、ファイルの10行目から20行目までを読みこむっていう感じです。
今のところ
FILE *fp
char buf[1024];
以下条件でくり返し
fgets(buf, sizeof(buf), fp)
で行を読みとばしていますが、他にいい方法が在りましたら教えて下さい。
0402デフォルトの名無しさん2005/05/24(火) 01:50:02
>>401
バッファいらね
fgetc で充分
0403デフォルトの名無しさん2005/05/24(火) 01:51:50
>>402
fgetcは一行読み込みでしたっけ?
0404デフォルトの名無しさん2005/05/24(火) 01:55:35
>>400
回答早っ
まぁ、何をもって、綺麗・汚いを判断するかは個人的な趣味なので
その判断基準については、特に俺から何を言うつもりはないが
最低限、皆が納得出来る、この問いに対する綺麗なロジックを書いてみせろ
0405デフォルトの名無しさん2005/05/24(火) 01:56:55
これまた重度の鉄砲玉だな・・・(ポリポリ
0406デフォルトの名無しさん2005/05/24(火) 02:06:58
なんで、こんな問題で熱くなってるんですか?
0407デフォルトの名無しさん2005/05/24(火) 02:09:13
>>405
書けないなら別に良いけどね
取り合えず、俺はそろそろ寝るが、書けるものなら書いておいてね
(綺麗なコードではなく、綺麗なロジックをね)

>>406
まぁ、売られた喧嘩だし…
0408デフォルトの名無しさん2005/05/24(火) 02:11:45
どんなコード書いてもきたないとか言うんだろうなw
0409デフォルトの名無しさん2005/05/24(火) 02:16:18
さぁ、これが俺様の書いたコードだ!
試してないので、動かなかったらスマソ

void foo ( char *p, int n ) {
int i ;
p += i = sprintf( p, "%d", n ) ;
p[i=(i-(n<0)-1)/3] = '\0' ;
while(i--) p -= 3, p[i+3] = p[2], p[i+2] = p[1], p[i+1] = *p, p[i] = ',' ; }

綺麗・汚いを判断するかは個人的な趣味なので、とやかく言うんじゃねぇぞ!
0410デフォルトの名無しさん2005/05/24(火) 02:16:43
バッファ長をどうするか、と問題点は明らかにした >回答を避けもしくは転嫁する欲求との対立をケンカと言う
設計ノウハウの伝授は有料である旨を提示した >それでも書けと要求

どう見るかは聴衆に任せる
0411デフォルトの名無しさん2005/05/24(火) 02:17:19
>>401
fgets()だと、バッファサイズまでしか読み込まんので、行が非常に長い場合は
完全な1行を読み込めない
そういう意味では、行読み飛ばすんならgetc()使ったほうがいい

# fgetc()とgetc()は機能が同じだが、getc()はマクロとして実装されており
# より効率的である可能性が高い

while ((c = getc(fp)) != EOF && c != '\n')
;
みたいな感じでいいだろう。
0412デフォルトの名無しさん2005/05/24(火) 02:17:52
見るのに聴衆なのか
0413デフォルトの名無しさん2005/05/24(火) 02:18:57
># より効率的である可能性が高い

こいつのバランス感覚も凄いことになってるな・・・・
0414デフォルトの名無しさん2005/05/24(火) 02:21:03
>>413
なんで?
fgetc()なんて誰も使わんでしょ
K&Rでも全部getc()だよ
0415デフォルトの名無しさん2005/05/24(火) 02:21:06
いいところなんだが、そろそろ落ちにゃならん (ばいなら
0416デフォルトの名無しさん2005/05/24(火) 02:22:04
65535 歩譲って仮に RAM ディスクだったにしても・・・
0417デフォルトの名無しさん2005/05/24(火) 02:22:39
>>398
寝る前にgcc落として試してみたら
>>382で思ってた通りに動いてるじゃん
こんな奴を相手にした俺がバカだったよ
0418デフォルトの名無しさん2005/05/24(火) 02:23:04
そのむかしgetcはマクロじゃなかったんだなぁ…
0419デフォルトの名無しさん2005/05/24(火) 02:23:52
>>411
なるほど。たしかに行が長ければそうなるね。
ただ、関数マクロは危険なので出来るだけ使わない方がいいとカーニハン先生が言ってた。
特にオーバーヘッドを考慮する必要がなければfgetcでもいいし、
行の長さが決まっているならfgetsでもいいね。
アリガトン
0420デフォルトの名無しさん2005/05/24(火) 02:25:12
>>418
今でもgetc()は別にマクロと決まってるわけじゃないんだよね
マルチスレッド対応のランタイムでは排他が必要になるから
結局fgetc()と同じ

マクロである可能性が高い、というだけ
0421デフォルトの名無しさん2005/05/24(火) 02:31:43
ま、コードの綺麗さとコードの質はまったく関係無いんだがな
コードを綺麗に書く奴が有能な職業プログラマである可能性が高いとは言えそうだけど
0422デフォルトの名無しさん2005/05/24(火) 02:33:07
コードを奇麗に書くことは堅牢なコードにもなりうるという説が在ります。
0423デフォルトの名無しさん2005/05/24(火) 02:33:47
まあ一説でしかないわな
0424デフォルトの名無しさん2005/05/24(火) 02:38:32
プログラミング作法にはコードを奇麗に書くことは、コードが正しく動く可能性を高めると書いてあったな
0425デフォルトの名無しさん2005/05/24(火) 02:41:55
コードが正しくメンテナンスされる可能性を高める、の間違いだと思う
0426デフォルトの名無しさん2005/05/24(火) 02:46:24
>>425
いや、それも一緒に載ってた
結局は誰が見ても一意に解釈されるような単純なコードが一番だと言う意味だ。
そういう意味では>>409が良いとはおもえない
自分だけが見る趣味の領域なら難解なコードも一興だけど。
0427デフォルトの名無しさん2005/05/24(火) 03:37:53
プレーンテキストからhttpリンクを抜き出す方法を教えてください。

0428デフォルトの名無しさん2005/05/24(火) 04:15:47
$ grep 'http://' plain.txt
0429デフォルトの名無しさん2005/05/24(火) 04:36:05
>>428
Cで
0430デフォルトの名無しさん2005/05/24(火) 05:36:02
型の宣言が unsigned のみで、 unsigned a; 等と宣言されてる場合、
unsigned int なのでしょうか?

intの場合、 intのサイズは処理系よって変化するそうですが、unsigned のみも
変化すると思って良いんですかね。
0431デフォルトの名無しさん2005/05/24(火) 07:33:26
>>430
そうだよ。
unsigned == unsigned int
sizeof (unsigned int) == sizeof (int)

でもC99ではintの省略はだめになったらしいけどね。
0432デフォルトの名無しさん2005/05/24(火) 07:39:24
関数テーブルってstatic付けないとダメポ?(・ω・`)

−−−−−−−−−−
typedef void (*func_ptr)(void);
int g_step;
static void step00(void)
{
(略)
g_step++;
}
static void step01(void)
{(略)
g_step++;
}
static void step02(void)
{
(略)
g_step++;
}
void main(void)
{
const func_ptr fnTbl[] = { step00, step01, step02 };
fnTbl[g_step]();
}
−−−−−−−−−−

いつも↑みたく書いてるけど。
0433デフォルトの名無しさん2005/05/24(火) 07:43:52
なんか例えで適当に書いたけど、要は
関数テーブルってよくstaticで見かける気がスルけど付けなかったらイクナイ事があったりするのかなぁ、と(・ω・`)
0434デフォルトの名無しさん2005/05/24(火) 08:03:16
>>379
一応動くけどね。
main(int argc, char *argv)
{
  char buf[16];
  int s;
  for (s=1234567890; s; s/=10) {
    seps(buf, s);
    printf("%10d ==> \"%s\"\n", s, buf);
  }
}
実行結果:
1234567890 ==> "1,234,567,890"
123456789 ==> "123,456,789"
12345678 ==> "12,345,678"
1234567 ==> "1,234,567"
123456 ==> "123,456"
12345 ==> "12,345"
1234 ==> "1,234"
123 ==> "123"
12 ==> "12"
1 ==> "1"
0435デフォルトの名無しさん2005/05/24(火) 08:59:57
結局のところ、>409=>382は>398がぱっと見動かないと思いこむぐらい読みにくいコードだと言うことだな。
そして>417=>382は自分のコードが動くか動かないか、わざわざコンパイルしないと判らないくらい自信がなかったわけだ。
>410は結局無視してるし。まぁ、>398も動かないと思い込む辺りが困ったもんだが。

>378や>366が(効率は兎も角)ロジックを追いやすいのとは対極だな。
#まして>371から>382と、本人はまとめて読みやすくしたつもりらしいけど……

一桁ずつ処理するタイプでは>367がバッファが必要な点とnの仕掛けの辺りがちょっと読みづらいな。
そうなると、一番シンプルなのは>387かな。
0436デフォルトの名無しさん2005/05/24(火) 10:00:04
>>387もたいして変わらんだろ
インデントごときでギャアギャア騒ぐな
0437デフォルトの名無しさん2005/05/24(火) 10:21:02
それはまた目の付け所がシャープじゃないねえ
0438デフォルトの名無しさん2005/05/24(火) 11:25:53
C# Db
0439デフォルトの名無しさん2005/05/24(火) 11:39:41
課題: 入力した数の2進数表示を「1桁目から逆に表示する」プログラム。
2 --> 0 1 ( 0 1 0 でもよい )
3 --> 1 1 ( 1 1 0 でもよい )
4 --> 0 0 1 ( 0 0 1 0 でもよい )
5 --> 1 0 1 ( 1 0 1 0 でもよい )

おねがいします
0440デフォルトの名無しさん2005/05/24(火) 11:43:07
宿題は別スレで
シフト(>>)使って & 1 すればいい
0441デフォルトの名無しさん2005/05/24(火) 11:43:45
>>439
入力された文字列を数値に直したあと
int numだと仮定するとまあ32ビットが相場だから
for文で0から31までまわしつつ
1とアンドして真なら1、偽なら0
num/=2してnextだな
0442デフォルトの名無しさん2005/05/24(火) 11:44:54
>>440
すみません
>>441
ありがとうございます
0443デフォルトの名無しさん2005/05/24(火) 11:56:11
>>439
マルチだったか。
死んで詫びろ。
0444デフォルトの名無しさん2005/05/24(火) 12:04:26
いいんだよ・・・
>>439は病気で、もう余命幾ばくも無いんだ
これが最期の宿題かもしれないんだ
0445デフォルトの名無しさん2005/05/24(火) 12:14:40
いままでUNIX/LINUX上でFortranを主に使ってきたんですが、C言語も覚えなければならないと思っています。
普通Fortranではg77とかの無料のコンパイラは信用ならず、有料のしっかりしたものを使っていますが、
C言語ではどのコンパイラを使えばいいのでしょうか。ちなみに、Win,MacOSX,Linuxの環境はそろってます。
0446デフォルトの名無しさん2005/05/24(火) 12:21:44
無料で超優秀な gcc とか(Win, linux)
金かけれるなら VisualC++ とか
0447デフォルトの名無しさん2005/05/24(火) 12:26:35
gcc は OSX でも使えるぞーい。
0448デフォルトの名無しさん2005/05/24(火) 12:34:10
Intelのコンパイラなら最適化最強
0449デフォルトの名無しさん2005/05/24(火) 12:49:20
>>445
Windows → MS VC 買え。しっかりしてるかどうかは別だが。
Mac OS X → 残念だったな。コンパイラは無料だ。
Linux → 無料のOSは信用してるのか?

つか、微妙にスレチ
0450デフォルトの名無しさん2005/05/24(火) 14:02:05
タイムゾーンを取得する方法を教えてください
0451デフォルトの名無しさん2005/05/24(火) 14:57:38
>>450
OSは?
0452デフォルトの名無しさん2005/05/24(火) 15:22:49
Windowsでコンパイラはbcc32です。
0453デフォルトの名無しさん2005/05/24(火) 15:47:24
>>452
C標準ではできない。よってスレ違い。
0454デフォルトの名無しさん2005/05/24(火) 15:50:10
車輪の再開発を異常に忌み嫌う傾向があるけど
そういう人達に車輪を再開発できる程の力は無い

次にお前は「する必要がないことのための力は不要」と言う
↓
0455デフォルトの名無しさん2005/05/24(火) 15:52:43
#intrude <stdio.h>

int main()
{
 return printf(( "%s, %s.\n", "Hello", "World" ));
}

表示がおかしいのですが、
コンバイラがバグっているのでしょうか?
環境はPCの98seです。
0456デフォルトの名無しさん2005/05/24(火) 15:54:52
#intrude
フゥーーーーーーーーーーーー!!
0457デフォルトの名無しさん2005/05/24(火) 15:55:06
>>455
かっこかっこ こっかこっか
かっこ こっか
0458デフォルトの名無しさん2005/05/24(火) 15:56:02
>>455
・コンパイラを疑う前に自分を疑え。
・表示がおかしいのならどうおかしいのか書け。
・コンパイラの警告Lvは上げておけ。
・関数の括弧の中にもう一つ括弧を入れるとカンマ演算子の意味が変わる。
0459デフォルトの名無しさん2005/05/24(火) 16:11:15
>>454
つーかスレ違い
0460デフォルトの名無しさん2005/05/24(火) 16:31:27
つーか基地外
0461デフォルトの名無しさん2005/05/24(火) 17:56:04
車輪の再開発をする人は基地外だそうだ
0462デフォルトの名無しさん2005/05/24(火) 18:55:25
コンピューターは嘘つかない!
0463デフォルトの名無しさん2005/05/24(火) 18:58:41
コンバイラかよ・・・
0464デフォルトの名無しさん2005/05/24(火) 20:32:20
< の左に空白あけたり
関数の前に空行あけたり
seまで書いたりするから
typo がわざとらしくギラつくんだよ

釣り師として三流、修行積んで出直して来い
0465デフォルトの名無しさん2005/05/24(火) 21:12:10
おっす!。おら教えて君。

で、16進数を10進数に変換する関数って標準であるんですか?。
自分で変換関数かかないとだめなのかな?。
0466デフォルトの名無しさん2005/05/24(火) 21:17:07
>>465
ヒント

#include<stdio.h>
int main()
{
int i;
scanf("%x",&i);
printf("%d",i);
}
0467デフォルトの名無しさん2005/05/24(火) 21:18:12
strtol
0468デフォルトの名無しさん2005/05/24(火) 21:19:23
16進数というのは数値なのか文字列なのか
10進数というのは数値なのか文字列なのか
0469デフォルトの名無しさん2005/05/24(火) 21:22:06
まともな回答してる奴は1人か・・・
0470デフォルトの名無しさん2005/05/24(火) 21:23:44
>>464
お前さんで三匹目だよw
0471デフォルトの名無しさん2005/05/24(火) 21:30:42
>>470
プログラムの技術的な話する気ねえ奴は板違いだ帰れ
0472デフォルトの名無しさん2005/05/24(火) 21:33:13
こんばんは、よろしくお願いします。
glib.hのなかのgint()関数を使用したいのですが、
includeフォルダーのなかに、glib.hファイルがないのです。
どうすればインストールできるのでしょうか。
0473デフォルトの名無しさん2005/05/24(火) 21:36:27
>>472
俺ならとりあえずglibでぐぐってみる。
0474デフォルトの名無しさん2005/05/24(火) 21:37:33
ちょっと教えてください。

iconv関数で、EUC→ISO-2022-JP
変換はできないのでしょうか?

openでは正常リターンするのですが、
iconv関数を発行するとエラーになります・・・
0475デフォルトの名無しさん2005/05/24(火) 21:44:58
>>473さんありがとうございます。
くぐってみたら、これってwindowsでは、無理なんでしょうか。
ダウンロードの解答ファイルの拡張子が、変なんです。
ということは,今日買った本は、無駄ということでしょうか。
泣き。。。
0476デフォルトの名無しさん2005/05/24(火) 21:45:26
環境依存なのでunix板かスレへ
0477デフォルトの名無しさん2005/05/24(火) 21:58:00
質問です。
fopenするときの慣例について教えてください。

if(fp = fopen(argv[1], "r") == EOF){
    fprintf(stderr, "file open errer!!\n");
    exit(1);
}

みたいな感じでツカ?
0478デフォルトの名無しさん2005/05/24(火) 21:59:18
>>468様
どちらも数値でございます。

なんかググったら変換関数がシェアーウェアーで有料とかあるんですけど・・・。
やはり普通は自作するのか??、な。
0479デフォルトの名無しさん2005/05/24(火) 21:59:21
>>477
おまえ向いてない
0480デフォルトの名無しさん2005/05/24(火) 21:59:49
fopen は失敗したとき NULL を返します。
0481デフォルトの名無しさん2005/05/24(火) 22:00:50
努力は認める
確かにマシになってきた
だが、連貼りしたら意味ない
今日は寝ろ
0482デフォルトの名無しさん2005/05/24(火) 22:00:54
>>478
おい、数値に10進も16進も無いぞ
表示するときに、初めてどっちで表記するか決める
0483デフォルトの名無しさん2005/05/24(火) 22:22:41
>>482
とりあえず、16bitの変換関数出来たからもういです。
16進なんて嫌いだー。
0484デフォルトの名無しさん2005/05/24(火) 22:25:06
ああそうだったNULLだ。
0485デフォルトの名無しさん2005/05/24(火) 22:33:39
>>474
UNIX関係スレへ。スレ違い。
04864742005/05/24(火) 22:46:47
スレ違い失礼しました
04874322005/05/24(火) 22:47:32
凄く、スルーされてる...
って事はstatic付けようが付けまいが変わらないて事か(・ω・´)
λ....
0488デフォルトの名無しさん2005/05/24(火) 22:47:55
(^^)>ドウモッス
0489デフォルトの名無しさん2005/05/24(火) 23:02:27
>>487
テキストとプロジェクタがあればきっちり説明できるから、あんた用意したら?
0490デフォルトの名無しさん2005/05/24(火) 23:05:27
>>487
staticつけると同一ファイル内でしか直接呼び出すことが出来なくなる
関数ポインタで呼び出した場合はどうなのか知らないけど
0491デフォルトの名無しさん2005/05/24(火) 23:08:58
関数ポインタで渡せばそりゃ問題なく呼べますよ
名前がぶつからないってこと
0492デフォルトの名無しさん2005/05/24(火) 23:13:19
>>488-491
(^^)>ドウモッス
0493デフォルトの名無しさん2005/05/25(水) 01:28:13
>>435
>バッファ長をどうするか、と問題点は明らかにした >回答を避けもしくは転嫁する欲求との対立をケンカと言う
これに回答する意味があるの?
この手の問題で、何をどう考えて、バッファ長が問題点になるのか俺には理解出来んよ…

>設計ノウハウの伝授は有料である旨を提示した >それでも書けと要求
結局書かずに>>409みたいな回答を返す奴に反論してもね…
大体、コードとロジックの区別もついてなさそうだったし…

それに、まとめたのは、見易すくする為ではなく、処理を軽くする為
printf()系や除算を無暗に使うのが嫌いと書いた、バランス感覚が悪いって言われたので
その他の処理が重そうに見えたのかなと思った(それでも他のコードよりは軽いはずだが)
前後の流れから、コードの見易さと、効率についてのバランス感覚ともとれるが
(その場合、俺の完全な勘違いであるが)
あの時点では、全体の効率の話だと思ったので、>>382のようになっただけ

まぁ、結局>>417が俺の結論な訳だけど
これ以上、この問題に付き合うつもりはないので、宜しく

>>ALL
板汚しスマソ
0494デフォルトの名無しさん2005/05/25(水) 01:34:31
できるだけコードは書くな。
標準で用意されているものを利用しろ。
それだけだ。
0495デフォルトの名無しさん2005/05/25(水) 02:06:30
しかし、ここまでムキになるとは
0496デフォルトの名無しさん2005/05/25(水) 02:23:04
↓筋肉登場
0497デフォルトの名無しさん2005/05/25(水) 02:35:38
↓漏れが風呂に入ってたら妹がいきなり入ってきて一言
0498デフォルトの名無しさん2005/05/25(水) 02:38:47
exit(0);
0499デフォルトの名無しさん2005/05/25(水) 02:57:22
                       /,,、-‐'''''" ̄,r‐‐'、- 、,,_      ヾ. 、
                       ,'ィ'_,,=---‐_,、(  ,、i-‐ '''''`ー- 、     ヽ'、
                      〃``'''フ' ̄,、-‐''´        `ヽ、  } }
.                        /  /   ,、-‐'' _,,、、-‐‐‐、 、,_ヽ //
                       , '  /  , //,、-‐''''''    )ノ/ノ〃
                       /ノ‐/ / ///=-‐''  _,、   ' ,,;;='=、
                    _,,,'_イ'|/ /, ,'イ/,'\,,、、-‐''"´_,、 ,   ‐-丶''、`ヾ、
                 ,、- '´  `ヽ /// /i/ー='、‐==''_;、-' // i i ヽ ヾヽ.
                /       }/,ヘミ;;、 ー= '=‐''´'´ ノノ / }  ヽ ヽ i
.               , '           ,} |!! ';;;,ヾ`  ー=二-‐''='´/  / i   ヽヽ!!
             /         ノ| i'       , -=;;='´/ /  /  i  l i
            /       ,、-',,ノ' :|'i、 、'ヽ,  _,、-=;;、`}、-=彳 ノ/  / / !
          / __     /==''  / iヽ、 ´  ’{=-'',〃,/´'" / /  / / /
         /  '´ ~~"'' ‐'- 、,へ、_ / / i; `;i丶-‐'i´ー=二-‐''´ / /.///   ご、ごめん。すぐ出て行くから!
        /           / 〃´`"''、 i; / i|イ// //ー=二-‐',、-'´//
         '、          i i'〃   \i;、,  !ノ||i ||/ ~"二,,、、-‐'' '
          '- 、,,__,,,、、--‐‐‐;,,、'!      ヽ i、ィ、ソiiソ !
                     ''~丶     ヽ.〉) \!
                        'i    '、. ', \
                        / r'⌒'、 i. iヽ '、
                      i .ノ   } } ./ '、_!
                       'y'   'し‐'   
0500デフォルトの名無しさん2005/05/25(水) 02:58:49
if(more == fopen("furo","r"))
{
return 0;
}
0501デフォルトの名無しさん2005/05/25(水) 07:42:32
>>475
俺ならとりあえず拡張子でググってみる。
0502デフォルトの名無しさん2005/05/25(水) 10:54:24
型tの二つの引数を交換するマクロswap(t,x,y)を定義しなさい。
このマクロはブロック構造を使い、swap(double,one,two)に対して,
以下のような出力が得られるものとする。
Cのコンパイラgccは-Eオプションを付けてソースファイルをコンパイルするとプリプロセッサの処理までを行い、
結果を標準出力に出力する。
これを利用して正しく展開されることを確かめなさい。

{
double temp;
temp = one;
one = two;
two = temp;
}
0503デフォルトの名無しさん2005/05/25(水) 10:56:15
見たことあるな、ごく最近
宿題ならスレ違いだが・・・
0504デフォルトの名無しさん2005/05/25(水) 11:45:45
ここってスレの質問まとめみたいなのないの?
0505デフォルトの名無しさん2005/05/25(水) 12:19:01
何の詫びもなくマルチですか
0506デフォルトの名無しさん2005/05/25(水) 13:22:15
>>502
俺に命令するなぁっ!!!
0507デフォルトの名無しさん2005/05/25(水) 16:37:55
急速にスレの質が低下してまいりました
0508デフォルトの名無しさん2005/05/25(水) 17:45:16
浮動小数点型データを5個入力して、最大値、平均、最小値を求めてください。
0509デフォルトの名無しさん2005/05/25(水) 17:51:53
求めました。
0510デフォルトの名無しさん2005/05/25(水) 17:55:48
508のC言語プログラム教えてください。
0511デフォルトの名無しさん2005/05/25(水) 18:04:33
断る。
0512デフォルトの名無しさん2005/05/25(水) 18:06:44
宿題か?宿題は別スレなんだが。
0513デフォルトの名無しさん2005/05/25(水) 18:12:05
>>472のって
ここでも無理なものなの?
cygwin + mingwn + gcc 相談室
http://pc8.2ch.net/test/read.cgi/tech/1058134693/
0514デフォルトの名無しさん2005/05/25(水) 19:17:13
>>512
宿題じゃなくて仕事です。お願いします。
0515デフォルトの名無しさん2005/05/25(水) 19:19:34
…辞表出せよ
0516デフォルトの名無しさん2005/05/25(水) 19:22:49
>>514
「コンピュータ演習」の宿題だろ?
0517デフォルトの名無しさん2005/05/25(水) 19:27:42
>>514
>>508を自力で出来ないならマジで辞表を出した方が良いよ。
0518デフォルトの名無しさん2005/05/25(水) 19:41:23
無理せず表計算ソフト使えば?
0519デフォルトの名無しさん2005/05/25(水) 20:27:15
>>514
仕事なら calc か excel 使え
絶対に自分で作るな
0520デフォルトの名無しさん2005/05/25(水) 20:58:30
環境によって呼び方違うかもしれないので、一応Windows用のgccの場合として。
オブジェクトファイル(*.o)とライブラリファイル(*.lib)の違いって何でしょうか?
0521デフォルトの名無しさん2005/05/25(水) 21:06:26
>510
#include<stdio.h>

#define GET_MAX(Y,X) if(Y<X){Y=X;}
#define GET_MIN(Y,X) if(Y>X){Y=X;}
#define GET_DATA(X) GET_MAX(max,X);GET_MIN(min,X);sum+=X;
int main(int argc,char **argv){
int a[5]={1,2,3,4,5};
int max=0;
int min=0;
int arv=0;

long sum=0;

sum=max=min=a[0];
GET_DATA(a[1]);
GET_DATA(a[2]);
GET_DATA(a[3]);
GET_DATA(a[4]);

printf("最大値=%d\n",max);
printf("最小値=%d\n",min);
printf("平均値=%d\n",sum/5);
return 0;
}
こんなのでどうよ?一応動くぞ
0522デフォルトの名無しさん2005/05/25(水) 21:57:39
ゲームプログラマになりたくて学校で勉強してるんだけど、内容がVBなんだよね。
ゲームプログラマを目指してるならCを学べと知り合いから聞いたのでこのスレに来たんだけど
VBとの違いはなに?VBからCへ乗り換えるってキツイかな?それとC言語を使うために必要な
ツールみたいなのは>>2にある所から落とせばいいの?
0523デフォルトの名無しさん2005/05/25(水) 22:04:19
>>522
真面目に言うけど、それくらい自力で調べられないとプログラマなんてできないぞ
0524デフォルトの名無しさん2005/05/25(水) 22:06:07
つか、いまさらVB教えてるところは無いだろ。
0525デフォルトの名無しさん2005/05/25(水) 22:16:43
>>522
GikoParo はプレーしてみた?
0526デフォルトの名無しさん2005/05/25(水) 22:18:24
エロゲならVBで十分ですよ。
0527デフォルトの名無しさん2005/05/25(水) 22:20:01
 Borland C++ Compiler wを今ダウンロードしているのだが、こんだけでcできるのー?
0528デフォルトの名無しさん2005/05/25(水) 22:20:38
あとメモ帳が必要
0529デフォルトの名無しさん2005/05/25(水) 22:21:11
いや 522 はグリグリの3Dエロゲを作る気かもしれんし。
0530デフォルトの名無しさん2005/05/25(水) 22:29:35
メモ帳か・・・
サクラエディタの方がいいて書いてあったんだがどうなんだろうか

BCCってコンパイラだよね
リンクするソフトとかって必要なの?
0531デフォルトの名無しさん2005/05/25(水) 22:35:04
検索すら出来ないのか
0532デフォルトの名無しさん2005/05/25(水) 22:46:42
BCC DL
できなかったら
MinGW DL使用としたらこれ日本語表示にばぐがあるらしい
つーことで
Digital Mars C/C DL中〜

05335222005/05/25(水) 22:56:12
エロゲとかじゃなくて普通のゲームを作りたいと思ってるんだけど・・・
それで、CってVBとは全くの別物なんだよね?
0534デフォルトの名無しさん2005/05/25(水) 22:57:27
>>533
「別物」とはどういうことかわからん
バージョンが違っただけで別物だが・・・
0535デフォルトの名無しさん2005/05/25(水) 22:58:31
>>534
言葉足らずでスマソ。同じような感覚でプログラミングが出来るかどうかって事
0536デフォルトの名無しさん2005/05/25(水) 23:00:16
>>535
同じような感覚でプログラミングができないのなら諦めた方がいい。
0537デフォルトの名無しさん2005/05/25(水) 23:01:34
>>533
VBで作ってもこのくらい
http://www.geocities.co.jp/SiliconValley-Oakland/7907/gikoparo.html

昔は CPU 500 [kHz] とかでシューティング作ってたんだぞ
0538デフォルトの名無しさん2005/05/25(水) 23:08:48
Z80の頃しか知らないからなぁ
4MHz弱もあったし速かったよね
0539@@2005/05/25(水) 23:12:05
>>537
8ビットCPUでもCPU 500 [kHz]とは聞いたことないが?

500 [MHz]ならつい最近
0540デフォルトの名無しさん2005/05/25(水) 23:16:19
何週間か前まで使っていた俺のPCのCPUは433MHzだった。
0541デフォルトの名無しさん2005/05/25(水) 23:18:02
むしろkそのものに突っ込みたい。
0542デフォルトの名無しさん2005/05/25(水) 23:20:57
>>539
シューティングが動くかは知らんが500kHzなら8008だと思われ
8080以前なので(今現在)PC(と呼ばれるようなもの)ではないと思われ
0543デフォルトの名無しさん2005/05/25(水) 23:29:07
VBなんかならったことないよ・・・
あれって直感で使うものだろう?
0544デフォルトの名無しさん2005/05/25(水) 23:33:18
Intellivision
Debuted in: 1980
Cost then: $299
Equivalent price today: $624.13

By 1980, you had to be living on Mars not to understand that there was an enormous
amount of money to be made in electronic and computer games. Famous toy manufacturer
Mattel decided to tap that bonanza with the release of its "Intelligent Television" console,
the Intellivision, in early 1980.

Intellivision represented another technological leap forward for home consoles
(a 16-bit GI microprocessor running at 500KHz - HOT!), and this was made clear by
its graphics. With a high resolution of 192 x 160 pixels, Intellivision was able to display
some fairly realistic graphics, which were evident in its many sports games that blew
away anything the 2600 or other consoles had. Intellivision sacrificed some speed to
get those fancy graphics, however, so for real arcade action, gamers found the 2600
to be the system of choice.
http://www.classicgaming.com/features/articles/ps2/
0545デフォルトの名無しさん2005/05/25(水) 23:56:27
配列を他の関数に渡すときポインターで渡すのはいいんだけど
渡された関数側で
*(a+1),*(a+5)
って状態で配列を使うとのかけ算するときに
(*(a+1)*(*(a+5)))
のように括弧だらけになってしまって、なんか見にくい・・・
a[1],a[5]
とかの状態に戻した方がいいのかな?
05465332005/05/26(木) 00:00:48
C言語の初心者向け教本買って基礎を勉強してきます。それで分からないことがあったら
質問しにきますね。ノシ
0547デフォルトの名無しさん2005/05/26(木) 00:01:40
>>545
>a[1],a[5]
>とかの状態に戻した方がいいのかな?

ポインタのままでもa[1],a[5]って形で使えたはずだが
0548デフォルトの名無しさん2005/05/26(木) 00:03:06
>>545
見やすいほうで書け
05495452005/05/26(木) 00:09:22
>>547-548
サンクス
そのままの形で使えたのねヽ(´∀`;)ノ
見やすい方があとあと楽だよね
055012005/05/26(木) 02:22:56
特定のディレクトリにあるファイルを削除する方法を教えてください。
実行環境はUNIXやLinux、コンパイラはgccです。
実行中に中間ファイルを作るんですが、終わったらいらなくなるので。
0551デフォルトの名無しさん2005/05/26(木) 02:28:31
C FAQでみた記憶がある。
0552デフォルトの名無しさん2005/05/26(木) 02:30:26
unlink
0553デフォルトの名無しさん2005/05/26(木) 04:00:43
何でremoveじゃなくてunlink勧める人が多いのかね。
unlinkがシステムコールであるOSが多いのはわかるが
標準に用意されているのに、避ける理由がわからない。
ファイルアクセスだとラッパーによる実行時間の差なんて問題にならないし。
0554デフォルトの名無しさん2005/05/26(木) 04:31:04
unlinkはPOSIXでは標準。
勧めても問題ない。
0555デフォルトの名無しさん2005/05/26(木) 04:35:35
ディレクトリを削除する方法を教えてください
0556デフォルトの名無しさん2005/05/26(木) 05:18:14
>>554
Unixスレでなら、な。

このスレでpthreadとかを扱うのは違う。
WinAPIはスレ違いと言いながら、同じ非標準を問題ないという神経が
腐っていると言われるのだよ。
0557デフォルトの名無しさん2005/05/26(木) 07:54:12
ドライブをフォーマットする方法を教えてください
0558デフォルトの名無しさん2005/05/26(木) 09:28:11
構造体の中に、別の構造体へのポインタを含めたいんですが、
一回で宣言できませんか?
0559デフォルトの名無しさん2005/05/26(木) 09:40:38
>>520
o(obj)を集めたものがa(lib)
0560デフォルトの名無しさん2005/05/26(木) 09:41:18
++ポインタ演算は覚えなくてもいいですか?
0561デフォルトの名無しさん2005/05/26(木) 09:45:01
覚えましょう
0562デフォルトの名無しさん2005/05/26(木) 10:09:50
double d = atof( "5.10" );
//結果 d に 5.0999999999999996が入る

d には 5.1 が入って欲しいのですが、どうにも困っています。
丸め誤差とかそういう問題でも無さそうですし(分からないですが)。
そもそも今までこんな事は無かった気がします。何かアドバイス頂けると助かります。
0563デフォルトの名無しさん2005/05/26(木) 10:31:45
WindowsではPOSIXは標準ではないの?
0564デフォルトの名無しさん2005/05/26(木) 10:32:55
>>562
小数点以下何桁いるかによるけど
2桁でいいなら


全部100倍しろ
0565デフォルトの名無しさん2005/05/26(木) 10:35:11
>>562
あきらめてください。10進法の5.1を2進法で表現すると循環小数になって
しまうので、それを有限の桁数で表そうとすると打ち切りによる誤差が生じ
ます。だから

double d = 5.1;

とやっても同じ結果になりませんか?
0566デフォルトの名無しさん2005/05/26(木) 10:42:13
>>563
http://pcweb.mycom.co.jp/news/2004/06/03/008.html
http://ja.wikipedia.org/wiki/POSIX
05675622005/05/26(木) 11:02:19
>>564-565
レスありがとうございます。
100倍で解決した上、おかげで問題点が良く分かりました。
元が文字列だったので、変な思いこみが有ったみたいです。
0568デフォルトの名無しさん2005/05/26(木) 11:08:19
横からなんだけど何を100倍するんだろう
文字列の段階で小数点をずらす事?
0569デフォルトの名無しさん2005/05/26(木) 11:31:42
scanf("%s/%s\t%s\n",&aaa,&bbb,&ccc);

と書いたコードに

xxx/yyy(タブ)zzz

を入力したら出力が

xxx = aaa/bbb
yyy = 妃唇(文字化け)
zzz = (無し)

になってしまいます。
スラッシュをエスケープしたらいいのかと思い、
\を直前につけたら
今度はコンパイルでwarningがでました。
一応そのまま実行したら同じ結果でした。
どうしたらいいのでしょうか?
よろしくお願いします。
0570デフォルトの名無しさん2005/05/26(木) 11:42:17
>>569
scanfで空白文字以外を区切りにしたい場合は、
%sのかわりに、%[]を使います。
この場合、%[^/] かな
0571デフォルトの名無しさん2005/05/26(木) 11:44:50
C言語というか数学に近いのだけれど、マージソートプログラムを作って、
その比較回数の理論値を求めよって問題で、色々調べたら、n個の要素だったら、
○×nlognだって書いてあったんだけど、何でそうなるか分からないし、
○の具体的な求め方も分からない。誰か教えてください!!
0572デフォルトの名無しさん2005/05/26(木) 11:50:26
>>570
scanf("%s%[^/]%s\t%s\n",&aaa,&bbb,&ccc);

こうしたら

xxx = aaa/bbb
yyy = ccc

zzz =

になりました。。。
さっきよりましだけど(´・ω・`)
むむむ・・・。
0573デフォルトの名無しさん2005/05/26(木) 11:54:09
おとなしくgetsしてあとでばらした方がいいのかなぁ・・・
0574デフォルトの名無しさん2005/05/26(木) 12:00:51
>>572
scanf("%[^/]%s\t%s\n",&aaa,&bbb,&ccc);
こうだよ。
意味わかってないのか。
どっかで説明読んで理解してくれ
0575デフォルトの名無しさん2005/05/26(木) 12:07:33
>>574
回答ありがとうございます。
ぐぐっても簡単なサイトばっかり引っかかってでてきませんでした。
まあ、探し方が悪いのかもしれませんが。
だからこそ最終手段のここに来たわけで。。。

xxx = aaa
yyy = /bbb
zzz = ccc

になりました。まだいろいろ試してみます。。。
0576デフォルトの名無しさん2005/05/26(木) 12:11:51
ああ、/とりたきゃ %[^/]/%s か。
0577デフォルトの名無しさん2005/05/26(木) 12:13:39
%[^/] の意味が載っているサイトっていうかブログ見つけました。
意味分かりまた。
んでyyyからスラッシュとるしかないかな・・・。
それともスマートな方法があるのだろうか?
0578デフォルトの名無しさん2005/05/26(木) 12:13:55
関数1から関数2を呼び出して
配列の値を関数2から関数1へ渡したいんだけど、配列の個数は関数2内で決めたい
関数1へ配列を渡すために関数2の引数を配列にしたんだけど
配列の個数を関数2できめられるんでしょうか?
0579デフォルトの名無しさん2005/05/26(木) 12:15:34
>>576
リロードする前に577を書き込んでしまいました。

%[^/]/%s

でやったらスマートにできました!!
ありがとうございます!!
0580デフォルトの名無しさん2005/05/26(木) 12:23:51
>>577
ぐぐる前に scanf() のマニュアル読もうよ…
0581デフォルトの名無しさん2005/05/26(木) 12:38:13
>>578
どういうことをやりたいのか、コードで書いたほうが早いと思う。
0582デフォルトの名無しさん2005/05/26(木) 12:44:29
>>578
mallocしてポインタで返せ。
0583デフォルトの名無しさん2005/05/26(木) 12:53:48
>>582
関数1の配列を渡して、関数2で配列の値を設定するんじゃないの?
0584デフォルトの名無しさん2005/05/26(木) 12:54:43
>>578
方法1 >>582のように関数2でmallocしてそのポインタを返す

・利点:関数1がサイズを気にする必要がない
・欠点:関数2の内部でmallocするためfreeを呼び出すのを忘れがちになりやすい

方法2 関数1でサイズとともに渡して足りない場合はエラー、もしくは途中まで処理

・利点:関数2がメモリ管理をする必要がない、関数1がスタックで確保した配列も扱える
・欠点:サイズが正しく渡ってないとエラーの原因に、呼び出す側がメモリ管理する必要がある
05855782005/05/26(木) 13:07:16
void damepo(int *a, int b){
    switch (b){
      case 1:
a[0]=1;
a[1]=2;
break;
      case 2:
a[0]=3;
break;
      }
}

void main(){
    int a[2], b;
    damepo(a, b);
}
こんな感じでbの値によって配列の個数が異なるのでmainで配列の個数を決めないで
damepoで配列の個数を決めたいです
配列は戻り値としてmainに戻るようにしたいです
05865782005/05/26(木) 13:12:42
>>581-584
mallocで定義する方法しかないんでしょうか?
freeを忘れてしまいそうだ・・・

>>585でうかつにも半角スペースを使ってしまったのでcaseより下が左に寄ってしまいますた
0587デフォルトの名無しさん2005/05/26(木) 16:15:34
初心者向けのC言語教本として林晴比古の「新C言語入門スーパービギナー編」を買ってきますた。
それでコンパイラってどこで落とせばいいんですか?>>2のサイト行ったけど英語でよく分かりませんでした。
0588デフォルトの名無しさん2005/05/26(木) 16:24:41
>>587
諦めろ。さもなくば初心者スレに逝ってこい。
0589デフォルトの名無しさん2005/05/26(木) 16:49:57
英語ワカラン&理解する気がないのなら日本語マニュアル付きの製品を買え
0590デフォルトの名無しさん2005/05/26(木) 16:57:21
>>587
タダで使えるBorland C++ Part4
http://pc8.2ch.net/test/read.cgi/tech/1091066805/
Microsoft Visual C++ Toolkit 2003 質問箱
http://pc8.2ch.net/test/read.cgi/tech/1109618655/
0591デフォルトの名無しさん2005/05/26(木) 17:09:03
キーボードから入力した整数値を小さい値の順場に並べるプログラム。
(関数を作成し、関数gets〔標準入力から文字列を取得する関数〕
を使用する。)

初歩的な質問で悪いですが、どなたかお願いします。
0592デフォルトの名無しさん2005/05/26(木) 17:12:02
>>591
それ、宿題じゃないだろうな?
0593デフォルトの名無しさん2005/05/26(木) 17:14:12
>>592
宿題じゃなくて仕事です。お願いします。
0594デフォルトの名無しさん2005/05/26(木) 17:22:34
仕事かよw
0595デフォルトの名無しさん2005/05/26(木) 17:25:31
>>593
>>514
0596デフォルトの名無しさん2005/05/26(木) 17:29:00
下記ソースコードでif(strcmp(p->key,item.key)==0)return0;
のp->keyの所がエラーになります。
data[5]のkeyの値を参照したいときはどうすればよいのでしょうか。
data[5]->keyでもうまくいきませんでした。誰か助けてください。

typedef struct profile Profile;
typedef Profile** Data;
typedef Profile Item;

struct profile{
Profile *next;
char* key;
}
int add(Data data, Item item){
Profile* p = data[5];
if(strcmp(p->key,item.key)==0)return0;
|省略}
int main(void){
Profile *list[N]={NULL}, dam;
dam.key="wada";
if(add(list,dam)==0)printf("wow");
|省略}
05975912005/05/26(木) 17:33:15
>>592
593は別人です。
宿題ではありませんが、最近独自で勉強しはじめました。
参考書にのっていた練習問題です。
0598デフォルトの名無しさん2005/05/26(木) 17:40:16
>>597
いずれにせよ、丸投げしてやって貰っても身に付くとは思えないが。
0599デフォルトの名無しさん2005/05/26(木) 17:42:47
これがゆとり教育の弊害か
0600デフォルトの名無しさん2005/05/26(木) 18:25:35
>>591
初心者スレへどうぞ。
0601デフォルトの名無しさん2005/05/26(木) 18:26:19
せめて自分がどう考え、どうやろうとして、
どううまくいかなかったかが
書けるくらいにはやってから来てちょうだい
0602デフォルトの名無しさん2005/05/26(木) 18:28:15
>>596
エラーメッセージは?
#コンパイルエラーじゃなくてランタイムエラーかな。それなら恐らくメモリ確保ミス。
0603デフォルトの名無しさん2005/05/26(木) 18:28:57
なんだかんだ言って、おまえら優しいな
06045912005/05/26(木) 19:07:01
>>601
#include <stdio.h>
#include <stdlib.h>
#define MAX_DATA 5
#define MAXLINE 256
void kansu(int data[MAX_DATA]);
int main(void);
void kansu(int data[MAX_DATA){
int i,j,tmp,data[MAX_DATA];
printf("並び替える前\n");
for(i=0;i<MAX_DATA;i++){
printf("data[%d]=%d\n",i,data[i]);}
for(i=0;i<MAX_DATA-1;i++){
for(j=i+1;j<MAX_DATA;j++){
if(data[i]>data[j]){
tmp=data[i];
data[i]=data[j];
data[j]=tmp;}}}
printf("並び替えた後\n");
for(i=0;i<MAX_DATA;i++){
printf("data[%d]=%d\n",i,data[i]);}
int main(void){
char buffer[256];
int data[MAX_DATA];
printf("整数を入力してください\n");
gets(buffer);
data[MAX_DATA]=atoi(buffer);
kansu(MAX_DATA);
return(0);}
こんなかんじになったのですがダメです。。。
入力した整数を配列に入れることがわかりません。
0605デフォルトの名無しさん2005/05/26(木) 19:11:47
>>604
んじゃ、入力部だけ。
for (i = 0; i < MAX_DATA; ++i) {
printf("整数を入力してください\n");
gets(buffer);
data[i]=atoi(buffer);
}
つーか、基本が判ってないようだから、続けるなら初心者スレにでも逝ってくれ。
0606デフォルトの名無しさん2005/05/26(木) 19:12:15
おー、でっかいうんち出したなー
0607デフォルトの名無しさん2005/05/26(木) 19:21:08
>>598
ソースを見るだけでも結構勉強になるぞ
0608デフォルトの名無しさん2005/05/26(木) 19:31:57
double型変数xに237番目の素数を代入。
y=(int)sqrt(x);yはint型
double型変数zにy番目の素数を代入し、次の計算をします。k=y-(int)sqrt(ゼット);kはint型
int型変数に115番目の素数、int型変数にiに116番目の素数を代入し、次の計算をします。
k/=(i-j);この結果が答えになります。

こんな問題を出されたので、解いたら"3"になったのですが、
答えは2だそうです。なぜですか?
06096082005/05/26(木) 19:32:40
#include <stdio.h>
#include <math.h>
#define NUM 1500

void sosuu(int *);

void main(void)
{
double x,z;
int a[300],y,k,j,i;
sosuu(a);
x=a[237];
y=(int)sqrt(x);
z=y;
k=y-(int)sqrt(z);
j=a[115];
i=a[116];
k/=(i-j);
printf("k=%d\n",k);
}
0610デフォルトの名無しさん2005/05/26(木) 19:33:39
void sosuu(int *a)
{
int prime[NUM+1],j,k,i;

for(j=2;j<=NUM;j++){
prime[j]=1;
}
for(j=2;j<=NUM;j++){
if(prime[j]==1){
for(k=2*j;k<=NUM;k++){
if(k%j==0){
prime[k]=0;
}
}
}
}
i=1;
for(j=2;j<=NUM;j++){
if(prime[j]==1){
*(a+i)=j;
i++;
}
}
}

上記のプログラムを作って求めました。
どこがおかしいのかわかりません
0611ログの人2005/05/26(木) 21:48:13
過去ログサイトの更新を停止します。
削除とかはしませんがよろしく。
0612デフォルトの名無しさん2005/05/26(木) 22:13:24
>>611
今まで乙
0613デフォルトの名無しさん2005/05/26(木) 22:37:05
>>608
何が間違っているのかわからないので、出題者に模範解答を示してもらってください。

関係ないけど、sosuu() はこう書いたほうが短いし速い。
void sosuu(int *a)
{
size_t i, j, num = 1;
for(i = 2; num < 300; i++)
{
for(j = 0; j < num; j++)
if(i % a[j] == 0)
break;
if(j == num)
a[num++] = i;
}
}
0614デフォルトの名無しさん2005/05/26(木) 22:39:08
> for(j = 0; j < num; j++)

for(j = 1; j < num; j++) だったorz
0615デフォルトの名無しさん2005/05/26(木) 22:48:02
>>613
本に載ってるエストラテネスのふるい(だっけ?)をそのまま書いて、
プリント部分を配列への代入に書き換えただけなので冗長になってしまいました。
参考になりました。件についてもそうしてみます。
ありがとうございました。
0616デフォルトの名無しさん2005/05/26(木) 23:07:12
質問です。
日本語を表示するにはどうやったらできますか?
printf("日本語\n");
ではうまく出来ないようです。
日本語を表示できる標準関数を教えてください。
環境は BCC32 5.5.1 です。
0617デフォルトの名無しさん2005/05/26(木) 23:07:43
Cって
ノートパソコンがDX3DやDriectX対応してなくても 3D使える?

HSPでは対応してなくても表示できたんだが・・・・
できるんだったら移行しよう。
0618デフォルトの名無しさん2005/05/26(木) 23:14:12
急速に(ry

>>616
そのBCCは英語版なの?
実行している環境は日本語のWindowsなの?

printf("日本語\n");
ってやったら、どううまくできないの?
0619デフォルトの名無しさん2005/05/26(木) 23:18:08
>>617
使える。
06205962005/05/26(木) 23:21:45
>>602
遅くなってすいません。
エラーメッセージは出ないで,急に強制終了(送信するしないの画面の奴)が
出て終わりです。それがp->を使うところで発生します。
エラーのでないエラーはレベルが高くて分かりません。
ポインタのポインタをポインタに代入しているところがいけないのでしょうか?
わけわかめです,おねがいします。
0621デフォルトの名無しさん2005/05/26(木) 23:31:08
>>620
まずは、そのpのアドレスを表示させてみたら。
&data[0-5]とかも
0622デフォルトの名無しさん2005/05/26(木) 23:35:37
>>620
そういえば、 Profile *list[N] は Profile list[N]でないの?
0623デフォルトの名無しさん2005/05/26(木) 23:46:06
>>608
よく見てないけど、このあたり?
608>double型変数zにy番目の素数を代入し、
609>z=y;
0624デフォルトの名無しさん2005/05/26(木) 23:51:46
>>623
おおっ!
z=a[y];にしたらちゃんと2になりました。
ありがとうございます。
問題文ちゃんと読んでませんでした;;
0625デフォルトの名無しさん2005/05/26(木) 23:53:00
ポルケ? サベスタントデカタルーニャ?
06265962005/05/27(金) 00:27:33
>>622
その通りやってDataの定義をあわせて買えたら
Profile* p = data[5]; で文句言われました。
'initializing' : 互換性のない型が含まれています
と言われました。*の数を買えると余計エラー出るし
0627デフォルトの名無しさん2005/05/27(金) 00:31:54
>>626
ちげーよ
そのポインタのさしてる実体はどこで確保してんのかってことだよ
0628デフォルトの名無しさん2005/05/27(金) 00:36:40
ポインタがわかってないで、コンパイラのメッセージだけを頼りに書いてるのか、もしかして
0629キムタク2005/05/27(金) 00:36:45
ちげーよ
0630デフォルトの名無しさん2005/05/27(金) 00:37:38
>>629
ちょっ まてよ!
0631デフォルトの名無しさん2005/05/27(金) 01:00:26
>>630
それホリだろ
06325962005/05/27(金) 01:07:10
>>626
確保って何?
とっておくの?
0633デフォルトの名無しさん2005/05/27(金) 04:12:01
NaNってなんですか?
0634デフォルトの名無しさん2005/05/27(金) 04:18:11
検索のしかたくらい覚えろ
0635デフォルトの名無しさん2005/05/27(金) 07:16:24
仕事と言えば宿題を片付けてくれると思ってる奴は初心者。
0636デフォルトの名無しさん2005/05/27(金) 07:50:37
>>611
  ∧_∧
 ( ´∀`) おまえ
 /,   つ   おつ
(_(_, )
  しし'
0637デフォルトの名無しさん2005/05/27(金) 09:27:46
>>632
省略した部分にあるのか知らんが、
Profile *list[N]
これは、N個のProfileへのポインタを確保したわけだろ。
で、それをadd()に渡してるわけだ。
で、add()でいきなりProfile* p = data[5] とやってるが、
このpはProfileへのポインタではあるが、それが指しているはずの
Profile自身はどこにも確保(定義)されてないでしょ
で、0で初期化しているようだからp->keyはNULLだから使ったとたんにエラー
0638デフォルトの名無しさん2005/05/27(金) 10:16:50
あれか
紙コップのジュース自販機で 紙コップが出ないのに
ジュースを入れちゃったのか
0639デフォルトの名無しさん2005/05/27(金) 10:20:51
あれ悲しいよな。
そんであとでむかつく。
0640デフォルトの名無しさん2005/05/27(金) 10:22:44
珈琲の自販機でカップにお湯だけ注がれるのも切な悲しい。
#どうやら豆を挽くことができなかったらしい。
0641デフォルトの名無しさん2005/05/27(金) 10:22:55
紙コップ出ない → 不安になる → ジュース出る → キター → 悲しみ → 憎しみ
0642デフォルトの名無しさん2005/05/27(金) 11:08:49
>>626
自分で何やってるか解らないまま
「コンパイルエラーを取るための修正」を繰り返してたって
いつまで経っても解決しない。
ポインタの基本からやり直した方がいいんじゃ…?
0643デフォルトの名無しさん2005/05/27(金) 11:39:27
>>638
紙コップは出たがにジュースの原液が出てこなかったというのは体験したことある
中身はただの水・・・orz
0644デフォルトの名無しさん2005/05/27(金) 14:35:22
char data[1000];
int a = 0;
void *p = data;
*(int*)p = a;

これでvoidポインタpが差すアドレスを進めたいのですが、
*(int*)p++ = a;
をやると怒られます・・・「'void *' サイズが不明です」
次の行で
p = (int*)p + 1;
をやればいいのですが、もっとスマートな書き方はありますか?

0645デフォルトの名無しさん2005/05/27(金) 15:22:12
>>644
pを最初からint*で宣言すればいいじゃないカ。
0646デフォルトの名無しさん2005/05/27(金) 15:58:24
*((int*)p)++ = a;
0647デフォルトの名無しさん2005/05/27(金) 16:03:59
昔はそれできたはずだよなあ
0648デフォルトの名無しさん2005/05/27(金) 16:05:35
コンパイラによるみたいだな・・・
0649デフォルトの名無しさん2005/05/27(金) 16:10:37
数の巾乗を計算する演算子はどうしてないのですか?
0650デフォルトの名無しさん2005/05/27(金) 16:11:52
むしろ、intとして扱うなら 最初からint の配列を確保した方が
char配列とかvoidポインタに拘るのはなんか意味あるんかい
0651デフォルトの名無しさん2005/05/27(金) 16:14:22
>>649
http://www.kouno.jp/home/c_faq/c14.html#7
0652デフォルトの名無しさん2005/05/27(金) 16:18:37
>>651
ありがとうございます。FAQにあったのですね。見落としていました。
いまmanでpowを調べましたが、整数の巾乗関数はないんですね。
自分で作るか…
06536442005/05/27(金) 16:42:22
このpにはint代入した後、続きにdouble置いたりしてるんで、
どうしてもvoid*がいいんです
(アプリ間で構造体のデータをクリップボード経由で転送したいんです)

>>646
'++'には左辺値が必要ですと言われました・・・(VC++.NET)
06546442005/05/27(金) 16:44:11
構造体だけならいいんですが、
メンバにmallocで確保したアドレスポインタもあるんで、
その実体もろとも転送する必要があり・・・
0655デフォルトの名無しさん2005/05/27(金) 17:03:55
*((int*)p)++ = って、
.cppだとエラーでて、.cだと通るな・・・

VC++.net2003
0656デフォルトの名無しさん2005/05/27(金) 17:07:52
gccはどっちでも通る・・・
0657デフォルトの名無しさん2005/05/27(金) 17:10:26
まぁ、言語的にはunion使うのが正解なんだろうが、
パフォーマンス落ちそうな気もするな。

union {


} p;
06586572005/05/27(金) 17:11:00
途中で送信してしまった・・・
0659デフォルトの名無しさん2005/05/27(金) 17:17:54
>>655
*reinterpret_cast<int *&>(p)++ = a;
0660デフォルトの名無しさん2005/05/27(金) 17:20:18
char data[1000];
int a = 0;

union {
void *void_p;
int *int_p;
char *char_p;
} p;

p.void_p = data;
*p.int_p++ = a;
0661デフォルトの名無しさん2005/05/27(金) 17:51:48
>>656
-pedantic付けると怒られる
0662デフォルトの名無しさん2005/05/27(金) 18:35:59
>>656
cast-as-lvalue という gcc 拡張で、gcc 4.0 で完全に廃止されました。
0663デフォルトの名無しさん2005/05/27(金) 18:39:47
あ、cast-as-lvalue とは違うか? すまん。
0664デフォルトの名無しさん2005/05/27(金) 19:12:30
freadで構造体に対して入力を行うと挙動がおかしいんですが,どういうことでしょう?

struct P {
int a, b;
};
struct P p;
int aa, bb;
てな感じで,
fread(&p, sizeof(p), 1, fp);
と
fread(&a, sizeof(a), 1, fp);
fread(&b, sizeof(b), 1, fp);
では値がずれてしまうんですが,どういうことでしょうか?
たぶん,構造体の方が1バイト余計に読み込んでるような挙動なんですが.
0665デフォルトの名無しさん2005/05/27(金) 19:19:02
winでテキストモードでオープンしてないか?
あと例は正確かい?
アラインメントだったりしないよね
0666デフォルトの名無しさん2005/05/27(金) 19:24:50
>>665
それでしたさんくす!!
0667デフォルトの名無しさん2005/05/27(金) 19:58:02
>619
どうやるの?
0668デフォルトの名無しさん2005/05/27(金) 20:05:21
cast-as-lvalue なんじゃないの?
0669デフォルトの名無しさん2005/05/27(金) 20:19:56
>>667
線が引けりゃなんとでもなるだろ。
0670デフォルトの名無しさん2005/05/27(金) 20:46:54
>>655
キャスト結果は左辺値ではない
よって副作用のある演算子の対象とできない

一部の処理系が非標準拡張として認めている場合がある

スレ違いだが C++ ではこの限りでない場合がある
0671デフォルトの名無しさん2005/05/27(金) 23:36:49
3を入力するとコマンドプロント上に

○○+
○++
+++

と表示させたいのですができません。
for文を使用して記述しているのですが、
ヒントとか模範解答とかエロい人教えて!
初歩的な質問で申し訳ない。
0672デフォルトの名無しさん2005/05/27(金) 23:38:49
>>671
3以外入力したらどうなるのか言えヴォケ。
0673デフォルトの名無しさん2005/05/27(金) 23:40:32
#include <stdio.h>

void main()
{
  int a;

  for(;;){
    printf("3を入力してください:");
    scanf("%d", &a);
    if(a == 3) break;
    printf("エラー: 3ではありません\n");
  }

  printf("○○+\n○++\n+++");
}
0674デフォルトの名無しさん2005/05/27(金) 23:42:22
>>672
スマソ
例えば4を入力すれば
○○○+
○○++
○+++
++++
と言う具合に増えていきます。
scanfで値を入力し、for文でこれを表現させたいんです。
0675デフォルトの名無しさん2005/05/28(土) 00:13:51
>>672
>>1
> ソース丸投げ、宿題、書籍 は専門の別スレがあるのでそこへさようなら。
0676デフォルトの名無しさん2005/05/28(土) 00:19:21
>>675
スマンorz
自力で頑張ってみる
0677デフォルトの名無しさん2005/05/28(土) 00:24:56
#include <stdio.h>

void main()
{
int Num;
int idx,jdx;
printf("数字を入力してください");
scanf("%d", &Num);

for(idx = Num;0 < idx; idx--)
{
for(jdx = idx;1 < jdx; jdx--)
{
printf("○");
}
for(jdx = idx;jdx <= Num; jdx++)
{
printf("+");
}
printf("\n");
}
}
0678デフォルトの名無しさん2005/05/28(土) 00:26:14
20年ほど前にBasicは自在に操っていた。
そして今、このネット時代にPERLを使ってCGI作成しようと思った。
しかし、難しすぎる。
というか、概念は理解できるが、表現がすごくわかりにくい。
Basicなら、
10 input a
20 input b
30 c=a+b
40 print C
…と、素直にスラスラ書けるのだが、
なんでパールとかは文字変数も数値変数も$xで表現されるのだろう?
ループ文にしたって、
10 for i=1 to 20
20 next i
…と簡単に書けるし、見ただけで文章としての意味も伝わる。
なのに、なんでパールはループの最後もif文の最後も}中カッコでしめないといけないの?

などなど、新しい言語を勉強している今、Basicのことと混同しちゃって困っています。
今にして思えば、逆に、Basicなんて覚えなきゃ良かったんだよね。

何がイヤかって、
~とか^とか_とか、Basicには無かった!
しかも、パールでは、;で文の終わりを示さないといけないクセに、
なんでループの中で
for($i=0;$i<=$#lines;$i++)
;が二回も使われるんだぁ?

とにかく、俺が一番好きなのは昔のBasicだ!
VBとかもダメ。なにが『ビジュアル』だよ!
全然意味がわからんし…(x_x)
0679デフォルトの名無しさん2005/05/28(土) 00:28:36
$が付くか付かないかとか}がどうのとかで難しいと感じるようになっちゃ終わりだな。
0680デフォルトの名無しさん2005/05/28(土) 00:30:07
>>679
$は許せるよ(^_-)-☆
0681デフォルトの名無しさん2005/05/28(土) 00:30:35
>678
ってか・・・本当にBasicを操っていたのか疑問だね。
0682デフォルトの名無しさん2005/05/28(土) 00:30:47
まあ>>678はマルチポストなわけだが
06836762005/05/28(土) 00:32:28
>>677
ありがとう!
この文を参考に理解できるよう勉強します。

�dクス!
0684デフォルトの名無しさん2005/05/28(土) 00:34:26
>>682
マジすかw
マルチポストして得するような内容でもないのに
0685デフォルトの名無しさん2005/05/28(土) 00:59:54
>>678
あんたホントに技術者かい?
0686デフォルトの名無しさん2005/05/28(土) 01:13:03
printf()とputs()はどっちが速いですか?
0687デフォルトの名無しさん2005/05/28(土) 01:14:00
puts
0688デフォルトの名無しさん2005/05/28(土) 01:14:57
んなこたない
0689デフォルトの名無しさん2005/05/28(土) 01:17:09
はやいとかそういう問題でなく、
表示する文字列に'%'が含まれているなどするとばぐるので
puts()つかったほうが、無難
0690デフォルトの名無しさん2005/05/28(土) 01:17:51
>>689
printf(str);
とやるからわるいのであって

printf("%s", str);
とかやればいいじゃないか
0691デフォルトの名無しさん2005/05/28(土) 01:19:20
printf("%s\n", str);
より遅い
puts(str);
の実装ってどんなだよ。
0692デフォルトの名無しさん2005/05/28(土) 01:23:29
>>686
未規定
0693デフォルトの名無しさん2005/05/28(土) 01:27:41
>>691
printf("%s\n", str);
が
puts(str);
になる実装もあったと過去ログで見た記憶があるが?
0694デフォルトの名無しさん2005/05/28(土) 01:33:34
勝手にそんなことするコンパイラはバグってる
0695デフォルトの名無しさん2005/05/28(土) 01:37:58
そうだな。ANSIの標準libcにリンクせずに自前でputsやprintfを実装
してたらどうなる

そういうことができないCはもはやCではないと俺は思う
0696デフォルトの名無しさん2005/05/28(土) 01:42:17
皆蟻が10
0697デフォルトの名無しさん2005/05/28(土) 01:56:04
>693
gccだっけか?
試してみたら、-O1オプション付けてコンパイルしたら
  printf("%s\n","giko");
とか
  printf("giko\n");
がpus呼ぶようにコンパイルされた。
0698デフォルトの名無しさん2005/05/28(土) 01:57:15
>>693
gccがそういう最適化をするよ。
0699デフォルトの名無しさん2005/05/28(土) 02:02:08
>>697
いやらCコンパイラだな
0700デフォルトの名無しさん2005/05/28(土) 02:23:45
>>699
パラマうんと元気になってね
みたいでなんかむかついた。
0701デフォルトの名無しさん2005/05/28(土) 03:40:42
A4でええよん
0702デフォルトの名無しさん2005/05/28(土) 05:12:03
助けてください。
半角の '¥' が入力できません!
改行がしたくてエスケープ文字の '¥n' や '¥r' が使いたいのですが
どうやっても入力できないのです。
色々やってみたのですがどうしても '\' みたいになってしまいます。
誰か教えてください!
0703デフォルトの名無しさん2005/05/28(土) 05:14:06
?
0704デフォルトの名無しさん2005/05/28(土) 05:31:51
>>702
??/ で代用しとけ。
07057042005/05/28(土) 05:37:16
ありゃ?
そういうアレじゃないか・・・
0706デフォルトの名無しさん2005/05/28(土) 06:38:45
「¥」を入力しようとすると「\」が出てくるって事か?
なら気にするな。しばらくCやってれば同じ字に見えるようになる。
まあ活字体と筆記体の違いみたいなもんだ。
0707デフォルトの名無しさん2005/05/28(土) 07:52:11
>>702
半角の¥は日本語のフォントだけで、欧米のフォントでは\の半角になる。
それに合わせて一部の日本語フォントでも半角の¥ではなく半角の\を表示するものもある。
0708デフォルトの名無しさん2005/05/28(土) 07:59:03
推理力が足りないんじゃないのか?
0709デフォルトの名無しさん2005/05/28(土) 08:15:08
>>702
なぜ、\ ではいけないと思ったのかをまず説明しろ
話はそれからだ
0710デフォルトの名無しさん2005/05/28(土) 08:36:17
エスケープ文字なのは'\'であって'\n'じゃないって突っ込みは無し?
0711デフォルトの名無しさん2005/05/28(土) 08:38:52
char c = '\';
は翻訳不能
0712デフォルトの名無しさん2005/05/28(土) 08:59:09
>>707
>一部の日本語フォントでも半角の¥ではなく半角の\を表示するものもある。
なにその阿呆なフォント…
/* つか、5/12 が¥なのに 7/14 がチルダ、っつーのが蔓延してる状況じゃ
  今更どーでもいい事かも知らんが */
0713デフォルトの名無しさん2005/05/28(土) 09:01:52
>>711
だから \ がエスケープ文字だって言ってるだろう。
0714デフォルトの名無しさん2005/05/28(土) 09:05:13
言ってる意味わかんねー
0715デフォルトの名無しさん2005/05/28(土) 09:06:54
>>712
Adobe Reader付属の小塚とか
0716デフォルトの名無しさん2005/05/28(土) 09:10:33
>0 が¥なのに 0 がチルダ

何言ってるの、こいつ?
0717デフォルトの名無しさん2005/05/28(土) 11:06:58
>>716
いやお前が何言ってるか解らん。
0718デフォルトの名無しさん2005/05/28(土) 13:06:45
5/12 = 0, 7/14 = 0 (冗談)って事だろ、少数切捨てで。
俺も712の言ってる事がわからん。
0719デフォルトの名無しさん2005/05/28(土) 13:11:28
整数除算を作ってみればわかるが
小数点以下が出てきたり「切り捨て」を行ったりはしていない
定数式 5/12 は定数式 0 と完全に等価なだけだ
0720デフォルトの名無しさん2005/05/28(土) 13:12:58
作るって何だよ。
整数除算は概念としてそこに存在するものだろ。
実装なんかどうでもよろしい。
0721デフォルトの名無しさん2005/05/28(土) 13:13:10
ますますわけがわからなくなってまいりました
0722デフォルトの名無しさん2005/05/28(土) 13:24:16
みなさんこちらへどうぞ
つhttp://pc8.2ch.net/test/read.cgi/tech/1115386557/
0723デフォルトの名無しさん2005/05/28(土) 13:26:22
つか、規格制定日のことだろ。
0724デフォルトの名無しさん2005/05/28(土) 13:34:23
きっとどこかの狭い井戸の中での表記法が標準だと思い込んでしまっているんだろう
C での表記法を知らないのもかなり痛いが、それでもせめて数学の表記で書けや・・・
0725デフォルトの名無しさん2005/05/28(土) 13:45:24
5/12→0x5c、7/14→0x7e。
折角頭があるんだから生きてるうちに使おうや。
既に腐り落ちているなら別だが。
0726デフォルトの名無しさん2005/05/28(土) 14:13:26
C言語では文字定数は4バイト?
sizeof('A')=4?
0727デフォルトの名無しさん2005/05/28(土) 14:15:59
>>726
4バイトという決まりはない
sizeof(int) と等しくなる
LSIC は sizeof(char) を返したりする。論外だな。
0728デフォルトの名無しさん2005/05/28(土) 14:16:37
質問です。
ファイルから、下記のデータを読み込んで、

A
A
B
B
A
A
B
B

順番を、
A
B
A
B
A
B
A
B

に、するにはどうすればいいのでしょうか?
ソートを使ってやるところまでは分かったんですが、
うまくいきません。
よろしくお願いします。
0729デフォルトの名無しさん2005/05/28(土) 14:18:30
>>728
どういう法則なんだよ?
口で説明してみぃ
0730デフォルトの名無しさん2005/05/28(土) 14:24:50
4つ読んで、1[23]4→1[32]4
かな?
0731デフォルトの名無しさん2005/05/28(土) 14:27:09
ソートでは出来んだろう・・・。
0732デフォルトの名無しさん2005/05/28(土) 15:10:33
>>725
どんな業界?
0733デフォルトの名無しさん2005/05/28(土) 15:20:14
>>725
そういうおまえも 724 を読むまで(ry
0734デフォルトの名無しさん2005/05/28(土) 15:58:51
狭い井戸の中での表記法が標準だと思い込んでしまっているんだろう
あげ
0735デフォルトの名無しさん2005/05/28(土) 16:16:39
質問です。
関数にOutputになる配列の引数を渡す際はその長さも同時に渡すべきですか?
void func( char *Output, int Output_size ){
if( data_len > Output_size )
return;

memcpy( Output, data, data_len );
}

配列を超えて壊す可能性があるからチェックというのはわかるんですが、
渡している長さも配列の本質的な長さではないし、
何か冗長な気がするので・・皆さんの意見をお聞きしたいです。
0736デフォルトの名無しさん2005/05/28(土) 16:18:08
>>735
そうするのがCでは一般的なんだからそれに従うべきだろう。
0737デフォルトの名無しさん2005/05/28(土) 16:21:02
>渡している長さも配列の本質的な長さではない

はぁ?
0738デフォルトの名無しさん2005/05/28(土) 16:24:50
>>735
関数の側では配列のサイズは知りようがない。
呼び出し側では知っている可能性がある。
だからサイズを知りたければ呼び出しがわに教えて貰うしかないんだよ。
0739デフォルトの名無しさん2005/05/28(土) 16:25:43
> 渡している長さも配列の本質的な長さではないし
ウソかもしれないってことだろ?
これはしょうがない。Cの配列はそういう意味で自己記述的じゃないから。
0740デフォルトの名無しさん2005/05/28(土) 16:29:35
>自己記述的じゃないから

なんだそりゃ
0741デフォルトの名無しさん2005/05/28(土) 16:31:13
配列自身が配列の長さ情報を持ってないってことさ
Javaなどの言語では配列自身が長さを知っている
0742デフォルトの名無しさん2005/05/28(土) 16:34:53
だから自己記述と何の関係が?
char (*p)[SIZE] なら1つの定義体がサイズ情報まで持っていたりするし
一般には Java だけで Java の処理系が作れるとき、Java は自己記述可能であるという
0743デフォルトの名無しさん2005/05/28(土) 16:36:02
んあこたぁない。Cだってそれくらい。

int array[32];
sizeof array / sizeof array[0]

まあ、関数の引数として渡した先まで伝わらないんだがな。
0744デフォルトの名無しさん2005/05/28(土) 16:38:19
> 一般には Java だけで Java の処理系が作れるとき、Java は自己記述可能
> であるという

誰も主語として「Javaが」とか言ってないわけだが。
中途半端な知識を振り回さずに、普通に日本語として解釈してくれや。
0745デフォルトの名無しさん2005/05/28(土) 16:44:00
>>743
char (*p)[32]

>>744
C の配列だけで C の配列の処理系が作れるとき、C の配列は自己記述可能であるという
0746デフォルトの名無しさん2005/05/28(土) 16:45:56
>>745
んで、それは元の質問のような場面で使えるのか?
0747デフォルトの名無しさん2005/05/28(土) 16:48:02
>>745
いやだから、誰も自己記述可能な「言語」の話なんかしてないんだっての。
言語について自己記述可能という用語が使われるのであれば、そういう
意味になるが、今回のはただの比喩として、より広い意味の一般的な
用語として用いてるわけ。
0748デフォルトの名無しさん2005/05/28(土) 16:51:41
自己記述的は意味が違くない?
Javaの配列は自分についての情報を保有/公開しているだけで、記述しているわけではない。
そういう自分で自分の情報を公開していることを表すもっと別な言葉があったはずだが忘れた。
0749デフォルトの名無しさん2005/05/28(土) 16:52:58
自己説明的だっけ?
0750デフォルトの名無しさん2005/05/28(土) 16:54:37
>>747
C スレでは少なくとも C 使いには通じる言い方を工夫したほうがいいんじゃないか?
0751デフォルトの名無しさん2005/05/28(土) 18:27:00
テキストエディタをCで作ってみようかと思っているんだけど
どこか参考になるサイトないですか
0752デフォルトの名無しさん2005/05/28(土) 18:44:38
テンプレ嫁
0753デフォルトの名無しさん2005/05/28(土) 20:54:57
C言語で書くよりアセンブリで書いたほうが速いプログラムが書けるといいますが、それはなぜですか?
コンパイルされたらアセンブリになるんだから同じじゃないの?

とあほな隣の上司が言ってたのですが
0754デフォルトの名無しさん2005/05/28(土) 20:57:07
>>753
あほな隣の上司が言った範囲を明確にしろよ。
どこまでがあほな隣の上司の発言で、どこがお前の意見(質問)なんだ?
0755デフォルトの名無しさん2005/05/28(土) 21:17:39
>>753
辞めちまえ。
0756デフォルトの名無しさん2005/05/28(土) 21:19:22
>>753
技術面での師匠か、事務局か、上司はタイプにより使い分けろ
0757デフォルトの名無しさん2005/05/28(土) 21:29:02
まともなコンパイラ使ってればCで書いたほうが速いのは今時常識だよ
0758デフォルトの名無しさん2005/05/28(土) 21:30:35
>>757
そーゆー発言に使う用語は「常識」じゃなく「定説」だろ
0759デフォルトの名無しさん2005/05/28(土) 21:52:20
>>756
至言ですな、パクります
0760デフォルトの名無しさん2005/05/28(土) 21:57:33
typedef struct tagAAA TAAA;

typedef void (FUNC)(TAAA *strp);

struct tagAAA {
 FUNC  *funcp
 TAAA  *strp;
};

----
こういう書き方に何か問題はあるでしょうか
0761デフォルトの名無しさん2005/05/28(土) 22:03:16
>>760
何か問題があったのですか?
0762デフォルトの名無しさん2005/05/28(土) 22:06:48
>760
>761

問題あるだろ→;
0763デフォルトの名無しさん2005/05/28(土) 22:10:46
セミコロンが見えなくなったら引退時か・・・orz。
0764デフォルトの名無しさん2005/05/28(土) 22:12:47
>>761,762 即レス感謝です。

----
typedef struct tagAAA TAAA;

typedef void (FUNC)(TAAA *strp);

struct tagAAA {
 FUNC  *funcp;
 TAAA  *strp;
};

----
セミコロン忘れてた。

あるコンパイラでは通らないとか
あまりおすすめできないとか
どんな細かいことでもいいです。

よろしくお願いします。
0765デフォルトの名無しさん2005/05/28(土) 22:25:16
わけの分からないネーミングが致命的
hage hige huge hege hoge foo bar を使え
0766デフォルトの名無しさん2005/05/28(土) 22:37:41
>>764
問題ない。
0767デフォルトの名無しさん2005/05/28(土) 22:51:56
JIS X0201 も知らん莫迦が月に吼える夜。
07687602005/05/28(土) 22:54:33
>>765
次回から使わさせて頂きます。

>>766
ありがとうございます。
0769デフォルトの名無しさん2005/05/28(土) 23:05:30
構造体についての質問です。
#include <stdio.h>

typedef struct node{
 int a;
 int b;
}node;

int main(void)
{
 node *new_node;

 new_node.a = 9;
 new_node.b = 8;
 printf("%d,%d", new_node.a, new_node.a);

 return 0;
}
とすると、
エラー「12,13,14行目:. または .* の左側に構造体が必要(関数 main )」
となってしまいます。どう使い方が間違っているか、教えてください。
07707692005/05/28(土) 23:06:44
あ、訂正です。
printfの二つ目の%dにはnew_node.bを代入です。間違えました。
0771デフォルトの名無しさん2005/05/28(土) 23:07:20
>>769
(*new_node).a か new_node->a が正しい
0772デフォルトの名無しさん2005/05/28(土) 23:08:00
 node *new_node;

実体に汁
0773デフォルトの名無しさん2005/05/28(土) 23:09:29
>771
実体n(ry
0774デフォルトの名無しさん2005/05/28(土) 23:10:31
>>769
まず言葉の使い方を正しく覚えること。
関数に値を渡すことを代入とは呼ばない。
他の人間とコミュニケーションをとるときに言葉の使い方が違ってると思わぬ落とし穴にはまる。

771のように訂正しても、new_node が初期化されていないのでこける。
なぜそこでポインタを使ったのか。
ポインタとは何なのかから勉強する必要があるかもしれない。
07757712005/05/28(土) 23:11:04
>>773
…吊ってくる
0776デフォルトの名無しさん2005/05/28(土) 23:13:21
node new_node = { 9 , 8 };
printf("%d,%d", new_node.a, new_node.b);
0777フィーバー2005/05/28(土) 23:15:55
 
07787692005/05/28(土) 23:19:09
みなさん、ありがとうございます。
>>774
実際に作っているプログラムでは、ポインタを使わなければ
ならないんです。だから、敢えて*new_nodeと宣言しました。

node *new_nodeと宣言したときは、node new_nodeと同じようには
いかないんですね。(構造体のポインタをさしているから当たり前ですか…)

あと、new_node->aはポインタを返すと勘違いしていました。
みなさん丁寧にありがとうございます。
0779デフォルトの名無しさん2005/05/28(土) 23:25:57
>>778
ポインタ変数はただ宣言すれば使えるものではなく、
malloc()とか&演算子とかでポインタの指す先を用意してやらないと駄目だからね。
0780デフォルトの名無しさん2005/05/29(日) 01:58:47
fgetsで標準入力から文字列を受け取った時、
fgetsで指定した範囲を超える部分が、2回目に呼び出したfgetsに強制的に渡されてしまいます。

文字列str1を調べて、改行コードが削られた場合に、文字が多すぎると判断することにして、
whileループでやり直すようにしてみたのですが、実行したところ、
溢れた文字列を、while文中のfgetsに渡してしまい、一回目の入力をやり直すことが出来ませんでした。

str1[]の要素数を大きくする以外に、何か対策は無いでしょうか。

char str1[8],str2[8];

printf("1回目の入力です。\n半角で7文字以上入力すると、2回目の入力が出来ません。\n");
fgets(str1,8,stdin);
printf("%s",str1);

printf("2回目の入力です。\n");
fgets(str2,8,stdin);
printf("%s",str2);
0781デフォルトの名無しさん2005/05/29(日) 02:34:09
C++を始めたいのですが、フリーで使いやすいソフトはないですか?
やはり>>2にあるのがいいんでしょうか?
0782デフォルトの名無しさん2005/05/29(日) 02:35:31
>>781
フリーと使いやすいは互いに背反。
07837812005/05/29(日) 02:39:44
>>782
確かにそうですね・・・
なら手当たり次第に落として自分にあったのを探してみます
0784デフォルトの名無しさん2005/05/29(日) 03:05:09
>>780
要するに、その時点でストリームバッファにたまっている文字列を
捨ててしまいたい訳だな。
実装によっては、読み込みの前にfflush()を呼べば済む場合もある。

ただし、入力系に対するfflush()の機能については、標準では
規定されておらず、実装系依存だったかもしれない。
0785デフォルトの名無しさん2005/05/29(日) 04:47:41
rewind() じゃないのか?
0786デフォルトの名無しさん2005/05/29(日) 05:20:21
>>780
普通に捨てれば。

> 改行コードが削られた場合に、文字が多すぎると判断する
の意味がわからんが、わざと改行を削ってみた。

int count;
char str1[8], str2[8];

printf("半角で7文字以上入力すると、2回目の入力が出来ません。\n");
count = 0;
printf("1回目> ");
while (fgets(str1, 8, stdin) != NULL) {
 int len = strlen(str1);
 if (str1[len - 1] == '\n') { // 改行削る
  str1[len - 1] = '\0';
  len--;
 }
 if (len < 7) {
  if (count == 0) {
   break;
  }
  count = 0;
  printf("1回目> ");
 } else {
  count++;
 }
}
0787デフォルトの名無しさん2005/05/29(日) 08:25:11
>>757
コンパイラごとに最適化されたコード書くくらいなら、
始めからアセンブラで書いたほうが早かったりするな。
07887802005/05/29(日) 14:31:49
>>784
ありがとうございます、ストリームバッファにデータが残っていたのが原因だったんですね。
それが分からなくて困っていました。

たしかにfflush()の入力系に対する使用は未定義のようです。
http://www.kouno.jp/home/c_faq/c12.html#26
ですが、私の環境、XPhome,bcc5.5では、使用できるようです。
http://www.borland.co.jp/qanda/lang/l0002014.html

>>786
>普通に捨てれば。
「捨てる」という発想がありませんでした。

fgetsで、入力が溢れてしまった場合、7文字+(改行)の場合、
strには最後の改行は保存されず、'\0'が書き込まれていた事と、
8文字以上の入力では最後の1文字の代わりに'\0'が書き込まれていた事と、
通常通り処理された場合である、6文字以下の入力では、strに改行コードが含まれていたので、
改行コードの有無でエラー処理を行えば大丈夫かと思っていました。

入力バッファに残っているデータが原因なので、確かに改行の有無は無意味ですね…。
最初は、fgetsに何かの問題があるのだと、思っていました。

0789デフォルトの名無しさん2005/05/29(日) 14:46:23
ほんとにわかってんのかな。
0790デフォルトの名無しさん2005/05/29(日) 14:53:21
>>788
「未定義」の意味を取り違えていると思われ
「できない保証」すらないのが未定義
0791デフォルトの名無しさん2005/05/29(日) 15:02:16
fread() の後に ftell()で位置を確認する場合、対象ファイルが標準入力
だと、読み込んだ分、現在位置が動かないのは通常の仕様なのかな?
 fopen()で開けば想定どおり。
ちなみにWindows XP,Borland コンパイラ5.5

fread(),fseek()でファイルを拾い読みしようとして
はまってしまった。
0792デフォルトの名無しさん2005/05/29(日) 15:05:58
ファイルがseekableなデバイスであることは大前提、だろ?
0793デフォルトの名無しさん2005/05/29(日) 15:13:05
>792 ごめん知らんかった。

同じファイルを、
% cmd < input_file
と
fp = fopen("input_file");
とするのは、結局同じかと思ってたんだけど、stdinを経由するから
別物になってまうのね。
0794デフォルトの名無しさん2005/05/29(日) 15:14:56
>>793
いや、それはOS次第。OSによっては標準入力が普通にseekできる。
0795デフォルトの名無しさん2005/05/29(日) 15:18:37
cmd < input_file
cat input_file | cmd
↑
これらが同じってのは横暴だな
FILE のメンバが処理系定義・・・いや未規定では議論のしようがないが
0796デフォルトの名無しさん2005/05/29(日) 15:19:48
つか、普通はリダイレクトした場合、0番のfdで普通にファイルを開いてる
だけだと思うよなあ。

なんか、Windowsのパイプだのリダイレクトが変なんだよ。リダイレクトも
パイプで実装してんのかも知れないな。
なんかキャラクタデバイスから読み込んでるような感じになるもん。
0797デフォルトの名無しさん2005/05/29(日) 15:25:30
つまり一番手っ取り早いのはEOFになるまで1文字ずつfgetcで拾うことか
0798デフォルトの名無しさん2005/05/29(日) 16:00:04
プログラム上で「ls」コマンドを実行して、出てくるファイルの一覧を
実行画面に表示するようなプログラムを作りたいのですが、手も足も出ない
状態です。。
読み込むファイル名を入力する一歩手前でこれを表示させたいのですが…

分かる方よろしくお願いします。
0799デフォルトの名無しさん2005/05/29(日) 16:44:08
main() {
time_t present_tm ;
struct tm *my_time ;

time(&present_tm) ;
printf("before:%d\n",present_tm) ;
my_time = localtime(&present_tm) ;
printf("after:%d\n",present_tm) ;
}

present_tm が localtime したあと、値が変わると思ったのに、
変わりません。なのにポインタで渡すのはなぜなのでしょうか?
0800デフォルトの名無しさん2005/05/29(日) 16:46:23
>>799
localtimeのパラメータはconstポインタなので、値が変わるわけがありませんね?
ポインタで渡す関数は他にもたくさんあるし、別に珍しくもありませんよね?
0801デフォルトの名無しさん2005/05/29(日) 16:52:28
レスありがとうございます。
珍しくないけど、これといった意味はないんですか?
0802デフォルトの名無しさん2005/05/29(日) 16:52:55
>>798
popen("ls", "r");
あとスレ違い。
0803デフォルトの名無しさん2005/05/29(日) 16:53:42
>>796
MS-DOSは、パイプもリダイレクトもファイルアクセス。
0804デフォルトの名無しさん2005/05/29(日) 16:57:01
>>801
俺の環境ではtime_tは64ビットだけど、他の環境ではどんなに巨大かもしれない。
巨大なデータを値渡ししたらオーバーヘッドが馬鹿にならない。
ポインタ渡ししとけばポインタ分のコピーだけで済む。
0805デフォルトの名無しさん2005/05/29(日) 16:59:28
>>804
なるほど、そんな理由があったのですか。恥ずかしかったですけど、
質問してよかったです。ありがとうございました。
0806デフォルトの名無しさん2005/05/29(日) 17:10:21
>>794
Windows でも標準入力にfseekを呼んでもエラーにならないし、
設定したとおり位置も動くから"seek"できてると思うんだけど、
fread()の後にftell()を呼ぶとずれる、というかちょっと少なめに
不定になるんだよね。

fread()を続けて読めばずれてない。
けどfread(),fseek()を交互に呼ぶと上記の理由でずれてしまう。
Windowsなんか中途半端にseekableなんだろうか。

まあ、ここで訊いたおかげでWindows標準入力要注意ということが
わかりました。皆様多謝
0807デフォルトの名無しさん2005/05/29(日) 18:21:55
char型変数4個をint型変数1個に、またはその逆のことも
したいのですが、どうすればいいのでしょうか?
0808デフォルトの名無しさん2005/05/29(日) 18:23:09
>>807
共用体。
0809デフォルトの名無しさん2005/05/29(日) 18:37:24
今やっと共用体の存在意義に気づきました!!
>>808さん ありがとう!
0810デフォルトの名無しさん2005/05/29(日) 18:50:25
whileの中にwhileがあって、その中にまたwhileがあって・・・
って構文の一番深いwhile文の中にif文があって、そこでif文が真なら
全while文の外に出たいとき、gotoを使うのが一番簡単だと思うのですが、
他にいい方法ってありますでしょうか。
gotoは使うなとよくいわれますので・・・。

while(A) {
while(B) {
while(C) {
if(D) 全てのwhileループの外に出る
else A, B, Cを更新
}
}
}

見たいな場合です。
0811デフォルトの名無しさん2005/05/29(日) 18:53:46
>>810
それは数少ないgotoを使うしかない場面。
気にせずgoto使え。
0812デフォルトの名無しさん2005/05/29(日) 18:55:17
>>811
ありがとう!
0813デフォルトの名無しさん2005/05/29(日) 18:59:12
結果を出力するファイル名を変数を元に決めたいと思っています。つまり,
fopen("filename","w");
のfilenameの部分に何らかの形で変数の値を入れれないものかと,思っているのですが,
このようなことは可能でしょうか?
fopenで無理なようでしたら,他の関数でも構わないのですが。
0814デフォルトの名無しさん2005/05/29(日) 18:59:53
>>813
snprintf()
0815デフォルトの名無しさん2005/05/29(日) 19:17:54
>>810
「goto を使わない」が出発点ではいけないが、
悪い設計の兆候ではあるから、上流設計におバカがないか点検は必要
0816デフォルトの名無しさん2005/05/29(日) 19:18:01
>>810
return
0817デフォルトの名無しさん2005/05/29(日) 19:20:55
>>813
このスレ的にはsprintf()だ。

>>810
或いはループ全体を関数にしてreturnで逃げる手もあるぞ。
#ほかにもいくつかあるが割愛。

>>806
それは寧ろ、テキストモードとバイナリモードのサイズの違いじゃないのかな?
#いずれにしても、詳細はWindowsスレかどこかで。
0818デフォルトの名無しさん2005/05/29(日) 19:27:52
質問よろしいですか?
ビット演算なのですが、あるビットに変数を代入する方法を
教えてほしいです。
例えば

char a = '1010';
char b[4] = {0x01,0x00,0x00,0x01};

for(int i = 0;i < 4;i ++){

/*
*/

}

コメントの部分でaの3ビット目にbの配列の値を
iの順番に代入して、
i = 0の時a = '1110'
i = 1の時a = '0110'
i = 2の時a = '0110'
i = 3の時a = '1110'
という結果にしたいのです。
0819デフォルトの名無しさん2005/05/29(日) 19:37:50
テーブル作って、
a = table[a*2 +b];
0820デフォルトの名無しさん2005/05/29(日) 20:15:20
上流設計などが気になるならC言語を使うな
Cはきちんと設計されたプログラムの作成には向いていない
0821デフォルトの名無しさん2005/05/29(日) 20:31:03
mbstowcs等で�dとか�_とかの文字がうまく変換できないのは仕様でしょうか
漢字やひらがなといった普通のマルチバイト文字は問題なく変換できています
環境はDebian/sidです
08228182005/05/29(日) 20:35:32
>>819
すいません。もう少し分かりやすく解説してもらえませんか。
0823デフォルトの名無しさん2005/05/29(日) 20:42:52
a = a & ~0x04;//reset
a = a | 0x04;//set
0824デフォルトの名無しさん2005/05/29(日) 20:54:37
>>810
A,B,C条件を偽にするフラグを使う。
08258182005/05/29(日) 21:29:55
>>823
そうです、それを教えてほしかったんです。
激貧環境なんで、演算で済むならとても良いです。
ありがとうございます。
0826デフォルトの名無しさん2005/05/29(日) 21:45:39
>>821
「�dとか�_とかの文字」がJIS X 0208に入ってないからじゃないか?
0827初心者のファイル入出力2005/05/29(日) 21:55:31
excelの符号付の数値データをCで読み込み、1次配列に格納していきたいのですが、うまくプログラムできません。
どなたかご教授していただけませんか?
excelのファイルの保存形式はデータごとにスペースを空ける.prn形式で保存しました。
以下はソースの一部です。visualCで作製しております。よろしくお願いします。
ia=0;
printf("カレントディレクトリーからデータを読み込みます。\n");
printf("ファイル名を入力してください。\n");
scanf("%s", filename); /*ファイル名の入力*/
if ((fp = fopen(filename, "r")) == NULL ) /*ファイルオープン*/
printf("%s can't be opened\n", filename);
else {
while(( c= getc(fp)) != EOF) /*データ読み込み*/
{
if(c !=' ')/*データファイルからスペースを取り除く条件*/
{
if(c !='\n')/*データファイルから改行を取り除く条件*/
{
while (c==' ')
{
c=getc(fp);
ax[ia]=ax[ia]+c;
}
}
}
putchar(ax[ia]);/*データ表示*/
ia=ia++;
}
fclose(fp);/*ファイルクローズ*/
}
0828デフォルトの名無しさん2005/05/29(日) 21:55:40
getch()だとキーをどれか一つ押した瞬間、エンター押さなくても文字コードを取り込んでくれますが
全角で入力した場合は必ずエンターで確定しなければいけないんでしょうか?
「y」キーを全角、半角どちらでも、押されたらエンターしなくても即反応するようにしたいんです。
0829デフォルトの名無しさん2005/05/29(日) 21:57:31
>>828
確定するまではその文字はIMEが握ってて
コンソールには渡らないから、だめだなあ
0830デフォルトの名無しさん2005/05/29(日) 22:06:03
>>827
Excelデータって普通M行N列あると思うんだが、それをどう
1次元配列に格納したいんだ?

それと、getc()で読むよりは、
fgets()で行読み→strtok()でカラム分解
のが楽だよ
まあ空のセルが無いと仮定しての話だがね
0831デフォルトの名無しさん2005/05/29(日) 22:08:36
>fgets()で行読み→strtok()でカラム分解

イタタタ
0832デフォルトの名無しさん2005/05/29(日) 22:09:47
>>831
なんかまずいのけ?
>>827のやろうとしているような仕事にはまさにその程度の手軽さが
お似合いだと思うのだが
0833デフォルトの名無しさん2005/05/29(日) 22:23:46
>>818
> char a = '1010';

何故、誰も突っ込まない…?
0834デフォルトの名無しさん2005/05/29(日) 22:27:03
普通sscanf()
0835デフォルトの名無しさん2005/05/29(日) 22:27:27
>>833
馬鹿馬鹿しくて読んでなかったから。
0836デフォルトの名無しさん2005/05/29(日) 22:38:05
>>829
なるほどそうでしたか…
即解答ありがとうございました。
0837デフォルトの名無しさん2005/05/29(日) 22:41:29
http://life7.2ch.net/test/read.cgi/world/1117168403/l50
電車男に続く名スレの予感・・
0838初心者のファイル入出力2005/05/29(日) 22:44:57
>>830
>>831
ありがとうございます。
ちょっと、やってみます。
0839デフォルトの名無しさん2005/05/29(日) 22:47:16
>>832
fgets 推奨と strtok 推奨のアンバランス
ポリシーのなさにイタタタ
0840デフォルトの名無しさん2005/05/29(日) 22:48:17
某ジョキョージュの太刀筋か?
0841デフォルトの名無しさん2005/05/29(日) 23:00:01
>>826
JIS X 0201な半角カナは変換できてるんですが
�Tとか�@とか�鰍焜_メでした
JIS X 0201とJIS X 0208以外はダメなんですかね
0842デフォルトの名無しさん2005/05/29(日) 23:15:24
>>839
ちゃんと説明できないなら
黙ってりゃいいのに…
0843デフォルトの名無しさん2005/05/29(日) 23:16:52
13区とかその辺のいわゆる機種依存文字ってMS独自だから。

ユニコードとのコンバータの実装ってさまざまだけど、
MS932(WINDOWS-31J)以外のエンコーディングを
変換する場合は、その辺の文字は扱えないのが普通。
0844デフォルトの名無しさん2005/05/29(日) 23:18:45
>>842
両方libcのごく標準的な関数なのに
>>839にはなんか違ったもの、アンバランスなものに見えるらしいな

まあフォーマットがちがちならfscanf()が一番楽だけどなー
08458182005/05/29(日) 23:18:51
>>833
上位4ビットは必要ないので、省略しました。
そんな程度の低い指摘をする人がいるなんて
普通思いませんから(^^;
0846デフォルトの名無しさん2005/05/29(日) 23:20:29
低脳が理由もなしに煽るから恥かくんだよ
しかも>>832は「手軽さ」とも言ってるのに
「ポリシーのなさ」てwwww池沼かお前は
0847デフォルトの名無しさん2005/05/29(日) 23:29:12
しかもどうアンバランスなのかすら言えてないしなw
0848デフォルトの名無しさん2005/05/29(日) 23:32:48
fgets()→strtok()と書いた>>830だけど。

うーん。手軽さっていうんなら素直にfscanf()使わせろよと
言いたかったのかなあ彼は。まあその方が楽だよね。

あと、俺個人はstrtok()は実は使わない(w
0849デフォルトの名無しさん2005/05/29(日) 23:32:56
>>845
ネタ神か…??
0850デフォルトの名無しさん2005/05/29(日) 23:34:42
>あと、俺個人はstrtok()は実は使わない(w

うげー
0851デフォルトの名無しさん2005/05/29(日) 23:36:16
>>850
だって空フィールドに対応できないし
スレッドセーフじゃないからstrtok_rが存在してたりとかその辺が
実装系でまちまちだし

BSDのstrsep()はそういう問題がないから、もっぱらそっちを使うよ。
strsep()が無い環境では、移植して使う。
0852デフォルトの名無しさん2005/05/29(日) 23:39:51
>>851
うげー
0853デフォルトの名無しさん2005/05/29(日) 23:51:08
>>818
a=a&~8|(b[i]<<3);
0854デフォルトの名無しさん2005/05/30(月) 00:10:09
strsepねぇ。
バグの元だし、マイナーだし、積極的に採用する理由が無い。
0855デフォルトの名無しさん2005/05/30(月) 00:30:54
>>843
サーバから受け取ったcp932な文字列をiconvでクライアントのエンコードにしてから
ワイド文字に変換しようとしてたんですけどワイド文字を使うのをあきらめた方が良さそうですね…
0856デフォルトの名無しさん2005/05/30(月) 00:43:10
> iconvでクライアントのエンコードにしてから

へえ、これは出来てたんだ。iconvならUCS4を経由するから
その時点でアウトになりそうなもんだがな。
0857デフォルトの名無しさん2005/05/30(月) 00:59:34
>>856
Linuxだとiconv -l にEUCJP-MSがあるのでこれを指定してやればiconvで変換できます
ただのEUCJPだと失敗します
BSDとかだとどうなのかはよくわかりません
でもFreeBSDのiconvにはEUC-JISX0213ってのがあったので出来そうかも。
0858デフォルトの名無しさん2005/05/30(月) 01:34:01
>857
スレ違いだが iconv に↓のパッチに相当するものが当たってるかどうかだと思われ。
ttp://www2d.biglobe.ne.jp/~msyk/software/libiconv-patch.html
FreeBSD の場合は WITH_EXTRA_PATCHES=yes にして ports から converters/libiconv をインストール
すれば OK。
08597862005/05/30(月) 01:53:19
>>820
>きちんと設計されたプログラム
とは?ソースがあったらキボン。
0860デフォルトの名無しさん2005/05/30(月) 01:57:58
>>809
インディアンに食べられるぞ!
0861デフォルトの名無しさん2005/05/30(月) 02:48:32
俺のC言語習得日記。使用書籍「はじめてのCプログラミング 秀和システム」
(入門書の進んだページ)

1日目108ページ
2日目2ページ(配列の例題が微妙に難しくて行き詰る)
(使っていた本がマイナーなので、有名な入門書をamazonで2冊購入)
3日目0ページ(2ちゃん見て遊びまくり)
4日目今日新しい入門書が届く予定(新版 明解C言語・解きながら学ぶC言語)
続く
08628612005/05/30(月) 03:06:18
●配列初期化の例題
 下記のサンプルプログラムは、配列の初期化と繰り返し処理を利用したものです。
Dataというint型配列に整数のデータがあり、その中に-1が混ざっています。-1を除外
対象として、5番目の値を出力します。

#include <stdio.h>

int Data[] = {-1, 1, 2, 3, 4, -1, 5, -1, -1, 6, 7, 8, 9};

main()
{
int i,pos;
int size;
int s;

s=5;/* 出力位置5をセット */
size=sizeof(Data)/sizeof(Data[0]);
/* sizeof演算子を利用して配列のサイズを調べます */
pos=0;
for (i=0;i<size;i++) {
if(Data[i]!=-1) {/* -1は除外対象 */
if(s==pos){
printf("位置=%d\n",Data[i]);
break;
}
pos++;
}
}
return 0;
}

これの解説、求む。
08638612005/05/30(月) 03:15:07
あ、やっと問題文が理解できた、-1を除外対象ってそういう意味か。
終了。
0864デフォルトの名無しさん2005/05/30(月) 03:58:10
どいつもこいつもCロートだなw
0865デフォルトの名無しさん2005/05/30(月) 04:01:04
ここはお前の日(ry
0866デフォルトの名無しさん2005/05/30(月) 09:55:44
ここはみんなのチラシの裏だから、どんどん書いてね
0867初心者のファイル入出力2005/05/30(月) 14:05:01
827です。
fgets()で行読み→strtok()でカラム分解のサンプルプログラムを教えてください。
0868デフォルトの名無しさん2005/05/30(月) 14:31:12
>>791
stdin、stdoutはランダムアクセスできないシーケンスの場合がほとんどだ。
(実際の仕事はシェルが行う。WindowsならCMD.EXEが行う)

C++で言えばInputIteratorとかOutputIteratorに相当するものだから、
ファイルを巻き戻そうとすると、その結果は処理系依存になるのでは。
0869デフォルトの名無しさん2005/05/30(月) 14:46:16
>>868
いや、それでもseekはできるだろ
できないというのなら!エラーを返さなければならない!
0870デフォルトの名無しさん2005/05/30(月) 15:17:57
教えてほしいのですが、

主プログラム(main)において標準入力(scanf)からデータ1文字を
読み込みアルファベットの小文字(a〜z)だけを(A〜Z)に変換し
標準出力(printf)へ書き出すプログラムを作成せよ。なお、小文字
から大文字への変換は関数で作成し、関数への値の受け渡しと変換
プログラムにおいてはポインタを用いよ。なお、できれば繰り返し
入力できるようにすることが望ましい。なお、関数内ではなるべく
printf()を使用しないようにすべきである。

という問題がありますが、これのプログラムとフローチャートを教えて
ください。お願いします。
0871デフォルトの名無しさん2005/05/30(月) 15:23:24
プログラムはともかくフローチャートがこんなところで書けるか。
0872デフォルトの名無しさん2005/05/30(月) 15:24:37
>>870
「望ましい」=「やる必要は無い」

大人になったらわかることだけど
0873デフォルトの名無しさん2005/05/30(月) 15:36:57
main関数を主プログラムと呼ぶくらいだから、フローチャートも必要なんでしょう
0874デフォルトの名無しさん2005/05/30(月) 16:24:43
>>870
丸投げは良くない(てか課題は自分でやれや・・・)
0875デフォルトの名無しさん2005/05/30(月) 16:35:56
これがゆとり教育の弊害か
0876デフォルトの名無しさん2005/05/30(月) 16:40:57
>>870
スレ違い。
C/C++の宿題を片付けます 44代目
http://pc8.2ch.net/test/read.cgi/tech/1116914132/
http://pc8.2ch.net/test/read.cgi/tech/1115386557/
0877デフォルトの名無しさん2005/05/30(月) 18:53:51
Linuxのfgets等で標準入力からマルチバイト文字を入力するときに
バックスペースで一つ前の文字を消そうとしても1バイトずつしか消えないのはどうにかならないのでしょうか?
fgetwsを使ってみても結果は同じでした
VCだとfgetsでも問題なくマルチバイト文字を扱えていた記憶があるのですが
0878デフォルトの名無しさん2005/05/30(月) 18:58:12
>>877
関数の問題ではなく、端末エミュレータの問題。
よって、スレ違い。いや寧ろ、鼬害。
0879デフォルトの名無しさん2005/05/30(月) 19:17:29
http://www.kumei.ne.jp/c_lang/intro/no_22.htm に
配列を初期化するには、配列が静的変数か、外部変数でなくてはいけません。

とあるのですが、こんなルール初めて聞きました。
理由は何なのでしょうか?
猫さんにメールしても、メルボム食らってる所為か、一向に返事が返ってきません。
もし、わかるかたがいらっしゃいましたら、レスお願いします。
0880デフォルトの名無しさん2005/05/30(月) 19:40:36
auto int a[] = { 1, 2, 3, 4 } ;
は駄目・・・って事ですかね? 読解力がなくて、別の意味に捉えちゃってるんでしょうか?
0881デフォルトの名無しさん2005/05/30(月) 19:47:33
いやK&R Cの頃はできなかったと思うが
ANSI Cではできるでしょ
08828822005/05/30(月) 20:31:38
いまいちプログラムの組み方がわからなくて・・・。
どういう風に以下のものをくめばいいのでしょうか?

「以下の手順にしたがって文字列を暗号化/復号化するプログラムを作成し
実行しなさい、ただし使用できるヘッダファイルは、stdio.hのみに制限します
1)2つの文字配列A、Bを用意する
2)文字配列Aに、対象文字を格納する
3)暗号処理か復号処理のどちらかを使用者に選択させる
4)文字配列Bに暗号/復号処理された文字を格納したあと、それを表示させる
<暗号/復号処理>
今回の暗号/復号処理では、対象文字の入力順を逆にし、さらに各文字
をアルファベット順で一文字分ずらす、暗号処理野場合は右に
ずらし、復号処理野場合は左にずらす。」
0883デフォルトの名無しさん2005/05/30(月) 20:34:46
>>879
881 が言っているように今は「ルール」ではなくなったが、
そーゆーことに無頓着な奴はやっぱり足手まといになるからしっかり勉強しとけ
肝心の答えは悪いがこのスレで答えるわけにはいかない
おまえさんが使っている処理系のスレか板で聞くといい
0884デフォルトの名無しさん2005/05/30(月) 20:36:46
>>879
理由は、静的か外部ならコード要らないからだよ
パラメタ並べてそのアドレスを入れとけばいいからね
autoだとそうはいかない。
0885デフォルトの名無しさん2005/05/30(月) 21:10:31
>>881,>>883,>>884
レスありがとうございました。
自分が未だ勉強不足であることを、ヒシヒシと痛感した次第です。
まだ、C言語をマスターする道のりは遠そう・・・
本当にありがとう、勉強になりました。
0886デフォルトの名無しさん2005/05/30(月) 21:37:52
autoだと内部的にmemcpyが発生するんだよな
だからライブラリを全無しでコンパイルするときは
注意が必要。
割り算も地味に鬼門だよな。
0887デフォルトの名無しさん2005/05/30(月) 21:55:24
C言語のfopen関数についてお伺いします。
このたびRedhat9でプログラムをコンパイル・実行をしております、コンパイルはG++とコマンドを打っています。

「000/list_data.dat」という位置にあるファイルを読み書きしようと思っているのですが、
fopenでのファイルオープンが失敗します。第1引数にその相対パス文字列を与えていますが、
試しに実行ファイルと同じディレクトリの「list_data.dat」でテストすると問題なく開くことが出来ます。
この現象が起こる原因と解決方法を教えて下さい。
0888デフォルトの名無しさん2005/05/30(月) 21:59:08
で、errornoとか、perrorとかはなんと言ってるんだ?
0889デフォルトの名無しさん2005/05/30(月) 22:00:37
>>887
犬板池
0890unkopopo2005/05/30(月) 22:04:16
jyokyoujyu
0891デフォルトの名無しさん2005/05/30(月) 22:08:13
http://www.st.rim.or.jp/~phinloda/cqa/cqa2.html#Q7
>ANSIのC言語の規格では、自動変数の配列は初期化できることになっていますが、
>以前のコンパイラは、なぜかANSI準拠と堂々と書いて販売されていたにもかかわらず、
>自動変数の配列を初期化するようなコードはエラーになってしまうものがありました

ネタ本が古いだけだろ。
0892デフォルトの名無しさん2005/05/30(月) 22:15:05
>>888
strerror(errno)で調べたところ、
No such file or directoryが帰ってきました、
しかしディレクトリ「000」は存在しますし、list_data.datも存在しています。
全く原因がわかりません、もしかするとディレクトリ文字が/じゃないのかと疑ってみましたが
\\にしても結果は同じでした。
0893デフォルトの名無しさん2005/05/30(月) 22:19:46
pwdは?
0894デフォルトの名無しさん2005/05/30(月) 22:39:18
ディレクトリ000のパーミッションが落ちてたりして。
0895デフォルトの名無しさん2005/05/30(月) 22:47:29
ls --show-control-chars は?
0896デフォルトの名無しさん2005/05/31(火) 01:45:25
おまえらスレ違いに優しいですね
0897デフォルトの名無しさん2005/05/31(火) 01:50:40
2000
Gladiator
Russell Crowe
Gladiator
Julia Roberts
Erin Brockovich
・
・
・
fopenでこのようなファイルのデータを取り込み、
構造体に格納したいのですが
どうすればいいのでしょうか?
お願いします。

struct zip {
char[20];
char[20];
char[20];
char[20];
char[20];
char[20];
}
0898デフォルトの名無しさん2005/05/31(火) 02:02:47
sscanfで空白も含む文字列を表現するフォーマットってのはできないのでしょうか?
0899デフォルトの名無しさん2005/05/31(火) 02:11:18
>>898
そんな事はない
0900デフォルトの名無しさん2005/05/31(火) 02:21:50
>>897
改行コードを検索してchar配列にコピーすればよろしかろう。
09018982005/05/31(火) 02:49:53
全ての文字を含む文字列を表現しようと
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/scanf.3.html
このあたりを見ながらしてるんですけどいまいちよくわからんのです
"%s %s [残り全部]"みたいな感じで
0902デフォルトの名無しさん2005/05/31(火) 02:54:36
>>901
無理
0903デフォルトの名無しさん2005/05/31(火) 03:41:42
   /          \
  /             i      アイキャンダンス♪
 ノ         ___ノ        加速させろ
(____,,--‐‐'''''"''':::::l.川     アイキャンレディゴー
  . |(●),   、(●)、.:|川 ゴーウェイ
  |   ,,ノ(、_, )ヽ、,, .::::|リリ       
.   |   `-=ニ=- ' .:::::::|(((     
 彡\  `ニニ´  .:::::/ミミ 携帯の映像が、変わるよ。
   /`ー‐--‐‐―´\                               
                 




0904デフォルトの名無しさん2005/05/31(火) 08:05:41
無理じゃないだろ
0905デフォルトの名無しさん2005/05/31(火) 11:03:06
これどーやるの?
キーボ ードから実数 x を入力し、ニュートン法と呼ばれる次のような反
復の式を用いて、近似的に x の平方根を求めるプログラムを作成せよ。
--
 xの平方根は、次の計算を| s(i+1)-s(i) | < ε, i=1,2,...となるまで繰
り返すことによって求めることができる。εは収束判定数である。

  s(i+1) = ( s(i) + x / s(i)) / 2
ただし、s(1) = 1 とする。

 なお、ε=0.00001として計算すること。


0906デフォルトの名無しさん2005/05/31(火) 11:13:36
>>905
do{o=s;s=(s+x/s)/2;}while((o-s)*(o-s)<e*e);
とかでいいんじゃないの?動かしてないけど
0907デフォルトの名無しさん2005/05/31(火) 11:18:30
あ、動いた。最後逆だったな。
0908デフォルトの名無しさん2005/05/31(火) 11:22:47
ありがとぉございます!
試してみますね。
0909デフォルトの名無しさん2005/05/31(火) 11:52:38
読み込んだ画像の中の左上と右下の2点を指定して長方形の形に画素を選択するのはどうしたらいいでしょう?
(水平垂直に線を延ばして囲まれた内側のような)
0910デフォルトの名無しさん2005/05/31(火) 12:01:18
>>909
画像は展開されてどこかメモリに
(x1,y1)-(x2,y2)の
画像の大きさはX,Yとすると
for(y=y1;y<y2;y++){ for(x=x1;x<x2;x++){
ひとつひとつ丁寧に
配列
ビットマップ
09118982005/05/31(火) 12:20:37
>>902 >>904
え?どっちが正しいの?
0912デフォルトの名無しさん2005/05/31(火) 12:31:31
>>911
"%s %s %[^\n]" でいいんじゃないの?
何もかも全部だと、終わりがわからないわけだが・・
0913デフォルトの名無しさん2005/05/31(火) 12:38:56
>>910
試してみます
0914デフォルトの名無しさん2005/05/31(火) 13:15:38
>>912
スペースが確保できていれば最後の%[]は%100000cでもいいよね。
0915デフォルトの名無しさん2005/05/31(火) 15:04:49
for (i = 0 ; i < 100000 ; i++)
{
a=a+i
b=b+i
}
と
for (i = 0 ; i < 100000 ; i++)
{
a=a+i
}
for (i = 0 ; i < 100000 ; i++)
{
b=b+i
}
とではどっちの方が実行速度が速いんでしょうか?
0916デフォルトの名無しさん2005/05/31(火) 15:12:14
>>915
最適化抜きなら前者
0917デフォルトの名無しさん2005/05/31(火) 15:12:24
自分で計れや
0918デフォルトの名無しさん2005/05/31(火) 15:16:19
>>916
最適化というのはコンパイラーが勝手にやってくれるんでしょうか?
それなら保守しやすい後者で書きたいんですが
>>917
計る技術がありませんw
0919デフォルトの名無しさん2005/05/31(火) 15:22:44
計る気がありませんww
うはwwwおkwww
0920デフォルトの名無しさん2005/05/31(火) 16:17:42
>>918
PC に計って貰えよ。
何のためにプログラムやってるんだ?
0921デフォルトの名無しさん2005/05/31(火) 16:36:32
>>918
タイマーを自作して詰まったらまた来てくださいね。ハート

ハイハイ次の方どうぞ
0922デフォルトの名無しさん2005/05/31(火) 16:40:28
タイマー?何の関係があるんだ?
0923デフォルトの名無しさん2005/05/31(火) 17:00:13
Cpadでコマンドラインから引数を渡すのはどうやればいいんですか?
ヘルプが見れないし、ホームページで探しても書いてないので教えてください。
0924デフォルトの名無しさん2005/05/31(火) 17:24:00
>>923
Ver2.31だが、
実行->実行時パラメーター。
09258612005/05/31(火) 17:41:46
ペリカン便

最新状況
ご住所が不明のため持ち戻りました。
5/31 15:28

死ね
0926デフォルトの名無しさん2005/05/31(火) 18:30:43
>>924
ありがとうございます、できました。
でまた質問なんですが、今、ttp://coconut.sys.eng.shizuoka.ac.jp/bmp/
にあるtest0.cを実行しようと思ってbmp.h bmp.c test0.c dog.bmpを保存して
実行しようとしたのですが、コンパイルしようとしても「・・・が未解決」となります。
プログラムが複数に分かれている場合はどうすればいいのですか?
コンパイル時パラメータをどうにかするんですか? 試したのですがうまくいきません
教えてください。
0927デフォルトの名無しさん2005/05/31(火) 18:56:44
>>926
コンパイラに依存する。
まずはコンパイル→リンクの2段階で.exeができることを理解しろ。
参考に、
http://okuyama.mt.tama.hosei.ac.jp/unix/C/slide84-1.html
09289272005/05/31(火) 19:00:31
つーか、
http://hp.vector.co.jp/authors/VA017148/pages/make.html
に書いてある。
0929デフォルトの名無しさん2005/05/31(火) 19:31:08
cc *.c
ってやっときゃ、大抵はオケ
0930デフォルトの名無しさん2005/05/31(火) 19:47:02
>>924
そうやって迂闊に答えるから
図に乗ってスレ違いの質問を続けるんだ。
0931デフォルトの名無しさん2005/05/31(火) 21:15:22
うかつなやつめ
0932デフォルトの名無しさん2005/05/31(火) 22:22:45
CでwavファイルをFFTなどをするソフトを作りたいんですが、
wavの取り込み方がよくわかりません、
どうやって取り込むのでしょうか。
0933デフォルトの名無しさん2005/05/31(火) 22:26:58
C Magazineでも読んでみれば?
0934デフォルトの名無しさん2005/05/31(火) 22:31:48
C言語初心者なのですが、どうやれば楽しみながらできますか?
オススメの本やサイトなどあれば教えて下さい。
0935デフォルトの名無しさん2005/05/31(火) 22:54:32
>>934
>>1
0936デフォルトの名無しさん2005/06/01(水) 04:34:10
openでいい?
0937デフォルトの名無しさん2005/06/01(水) 08:08:44
struct a b;という変数はどういう意味を持ってるんでしょうか?
09389372005/06/01(水) 08:38:50
自己解決しました
09399092005/06/01(水) 11:21:57
試してみるとは言ったものの、>>910 で教えてもらったことが良くわかりません
もう一度詳しく教えてください

2点を指定、というより1点から右に何ピクセル下に何ピクセル、って考えた方がいいのかな
0940デフォルトの名無しさん2005/06/01(水) 11:51:44
>>939
・画像の格納orアクセス方法
・画素の選択の意図するところ
これらが明らかでないからなんとも言えないが、
画素を取り出す関数int get(image1, int x, int y)、
セットする関数void set(image2, int x, int y, int pixel)が存在すると仮定して、
2点の座標がint x1, int y1, int x2, int y2 として与えられるなら
int ix, iy;
for (iy = y1; iy <= y2; ++iy) {
for (ix = x1; ix <= x2; ++ix) {
set(image2, ix - x1, iy - y1, get(image1, ix, iy));
}
}
でimage1から切り出したimage2が得られる。
0941デフォルトの名無しさん2005/06/01(水) 12:02:54
チラシの裏
printfのようにformat,...を引数にとる関数を自作してみようとした
参考にしてみようとglibcのソースをちょっと眺めてみたがサッパリわからなかった
チラシの裏おわり
0942デフォルトの名無しさん2005/06/01(水) 13:27:13
>>934
チョソバンク嫌い
0943デフォルトの名無しさん2005/06/01(水) 14:12:09
「fgets」で取得した全角の文字列を「printf」で出力させるにはどうしたら良いのでしょうか?
0944デフォルトの名無しさん2005/06/01(水) 14:24:44
%s
09459092005/06/01(水) 16:18:18
>>940
どうもです
選択された画素には1、そうでないのは0を与えて M(x.y)=0か1 の2進値のマップをつくって
M(x.y)=1の画素の全ビットを0の画素の最上位ビット以上にスケーリングがしたい
というわけなんです
094610912005/06/01(水) 16:41:25
c言語で文字列を印刷するときはどのコマンドを使用するのですか?
0947デフォルトの名無しさん2005/06/01(水) 17:02:16
>>946
そんなものありません
0948デフォルトの名無しさん2005/06/01(水) 17:06:43
>>946
コマンドの話ならスレ違い。
関数なら printf でも使っとけ。
0949デフォルトの名無しさん2005/06/01(水) 17:31:19
ちょっとしたステートマシンを書くのに
 自分自身の関数へのポインタを返す関数の宣言
で迷うんだけど void* を経由するしか表現方法はないのでしょうか?

|void* foo_1st(void);
|typedef void* (*STATE_FUNC)(void);
|STATE_FUNC next = foo_1st;
|while ((next = (STATE_FUNC)(*next)()) != NULL)
| ;
 ↑の STATE_FUNC へのキャストをなくす表現ってないものなかな? と。
0950デフォルトの名無しさん2005/06/01(水) 17:35:27
そりゃーポインタのポインタとして宣言してるから
095110912005/06/01(水) 17:43:52
947、948さんありがとうございます。
09529492005/06/01(水) 18:00:37
>>950
やはり 関数(*1)へのポインタ を 返す関数(*2) を宣言する場合に
型として *1 != *2 ならば 普通に書けそうですけど
型として *1 == *2 のケースは そもそも無理があるということですかね?

ステートマシン書く時は、整数値なり enum なり返して switch or テーブル参照して
次のステートをディスパッチするほうが一般的なのかな…
0953デフォルトの名無しさん2005/06/01(水) 19:09:42
>>952
戻り値の関数ポインタをstructでくるめば何とかできるけど、直接的に
は無理な気がする。

確かに、ステートマシンを書くなら状態番号を整数にしてやるのが一般
的だね。

09549492005/06/01(水) 20:01:31
>>953
ありがとうございます。
無理せず素直に、状態番号を戻すステートマシンにします。
0955デフォルトの名無しさん2005/06/01(水) 20:56:18
独習Cという本とBorlandの無料コンパイラを使いC言語を勉強している者ですが
プログラミング初心者でして分からない事があり、教えて頂けると助かります

質問1・次のプログラムは テキストファイルを読み込みA〜Zまでの文字が
それぞれ何回現れたかを数えるプログラムです。
int count[26]; を FILE *fp; の一行上に書くと、結果がめちゃくちゃになります
どうして mainの外で書かなければならないのか、どうしても分かりません
初歩的なことかもしれませんが教えていただけると助かります

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

int count[26];

int main(int argc, char *argv[])
{
FILE *fp;
char ch;
int i;

/* ファイル名の指定を調べる */
if(argc!=2) {
printf("ファイル名の指定がありません\n");
exit(1);
}

if((fp = fopen(argv[1], "r"))==NULL) {
printf("ファイルを開くことができません\n");
exit(1);
}
0956デフォルトの名無しさん2005/06/01(水) 20:57:26
while((ch=fgetc(fp))!=EOF) {
ch = toupper(ch);
if(ch>='A' && ch<='Z') count[ch-'A']++;
}

for(i=0; i<26; i++)
printf("%c は %d 回出現\n", i+'A', count[i]);

fclose(fp);

return 0;
}

質問2・Visual c++というソフトが非常に気になっているのですが、これが
どう役に立つのかが分かりません。テキストエディッタ・コンパイラ・デバッガ
が入っている開発環境と書かれていても、テキストエディッタならメモ帳で、
コンパイラ・デバッガならBorlandの無料ので、と思い、良さがピンとこないのです
やはりプログラムしやすいのでしょうか?C言語勉強するなら買っておくか
悩んでおります。
また、同じようなソフトでも購入するのはVisual C++ .NET Standard 2003
でいいのか迷ってます、professional だの2002 だの 2000いくつか無だの
Netだの 色々ありすぎてどれが新しくてどれがいいのかさっぱりです
予算は2万くらいまででお勧めあれば教えてください

質問3・独習Cという初級本を一通り勉強したら、次はAPIというのを
勉強しようと思っておりますが、勉強の順番としてはこれでいいのでしょうか?
「API??C言語ちょっと勉強しただけでAPIは早いよ、その前にこれ
勉強しとけ」みたいなのがありましたら教えて頂けると助かります
また、APIを勉強するにあたって、お勧めの本等ありましたら、教えてください

長々となりましたが、宜しくお願い致します
0957デフォルトの名無しさん2005/06/01(水) 21:13:45
>>955

> int count[26]; を FILE *fp; の一行上に書くと、結果がめちゃくちゃに
初期化してないだろう。
自動変数の配列は初期化しないと値が不定だぞ。main()の中に入れたければ

memset(count, 0, sizeof count);

のような初期化コードが必要になる。
0958デフォルトの名無しさん2005/06/01(水) 21:14:25
fgetc() の戻り値を char型で受けんな ぼけ
0959デフォルトの名無しさん2005/06/01(水) 21:17:50
>>955
それと、fgetc()の返り値をchに入れるんなら、chはintで宣言すべき。
EOFの値はintの-1だ。

VC++が役に立つかどうかは人によるんじゃないの。Windows上の開発では
一応業界のデファクトスタンダードみたいなものにはなってるが。これが、
少なくとも仕事で使う上では超重要。
Windowsの開発で他の開発環境を使うなら、VC++では不要な苦労が待っているが、
まあ学生さんならそういう苦労をするのも勉強になるかも知らんし、好きに
すればよかろ。
09609592005/06/01(水) 21:18:11
かぶった
0961デフォルトの名無しさん2005/06/01(水) 21:48:28
>>956
A2
実用ソフトを作るならpro以上。stanndardは最適化などのコンパイラオプションが使えないから。
デバッガは強力だから重宝している。

A3
APIと平行してc++のclassをそこそこ勉強すればいいんじゃないか。STLもかじって
扱える処理系の裾野を広げるというのもありだろう。
0962デフォルトの名無しさん2005/06/01(水) 21:50:21
>>956
俺は最初、BCCを使っていたがVCを使ってよかったと思っている。
デバッグ中はいつでもブレイクポイントでプログラムをとめられて、
そこから一行ずつステップ実行してどうプログラムが流れているかわかる。
さらにウォッチで変数の中身を直接見れる。それどこか自由に書き換えられる。

APIとはたぶんWin32APIのことだろうが、俺はそれよりもむしろC++を推す。
0963デフォルトの名無しさん2005/06/01(水) 21:59:51
>テキストエディッタならメモ帳で
とりあえず、これだけはあり得ないと言っておこう。
行数表示、grep、置換、tab文字の表示、対応する括弧の強調表示、自動字下げ機能は最低でも欲しい。

順番は、Cの勉強→C++の勉強→Windowsプログラミングをお勧めする。
WindowsAPIは仕様変更とかで数年後には使えないかも知れんが、恐らくC++の技術はかなり先まで役に立つ。
WindowsAPIはややっこしいしな。
0964デフォルトの名無しさん2005/06/01(水) 22:01:48
学校でずっとCを習ってきましたが、
就職して講習を受けたのはJavaとC#とCOBOLでした。
COBOLも古いですが、他の言語とは棲み分けができてるのでまだ需要があるそうです。
でもCの仕事はもう全然ないと聞きました。
まだCを業務で使っているところはあるのでしょうか?
0965デフォルトの名無しさん2005/06/01(水) 22:12:10
>>964
COBOLよりはずっと多い。
0966デフォルトの名無しさん2005/06/01(水) 22:14:31
つか、これからはDの時代だし。
0967デフォルトの名無しさん2005/06/01(水) 22:17:56
Eはまだか
0968デフォルトの名無しさん2005/06/01(水) 22:21:54
#define N 9
int main(void) {
  char **a;
  int i;
  a = (char **) mem_allocate(N); //mem_allocateはmallocのラッパ
  if (a == NULL) return 1;
  for (i = 0; i < N; i++) {
    a[i] = mem_allocate(6);
    strcpy(a[i], "Help!");
    printf("%p %x\n", a[i], a[i][0]);
  }
  putchar('\n');
  for (i = 0; i < N; i++) printf("%p %x\n", a[i], a[i][0]);
  return 0;
}

実行結果
0xa050200 48
〜小略〜
0xa0506f8 48

0xa050200 fffffff8
〜小略〜
0xa0506f8 48

a[0]が同じアドレスなのに%xの出力が違うのは何故だかわかりますか?
Nが8以下だと正しく48が出力されます。
0969デフォルトの名無しさん2005/06/01(水) 22:28:46
mem_allocate(sizeof(char*) * N)
0970デフォルトの名無しさん2005/06/01(水) 22:49:52
先に書き込まれたので補足。

>968
まず間違いなくメモり破壊。
char の配列を確保するのと、char * の配列を確保するのに同じ関数を使いつつ、
その引数が要素数っぽいのは明らかにおかしい。
たいていの環境で sizeof(char) と sizeof(char*) は違ってるだろ?
0971デフォルトの名無しさん2005/06/01(水) 23:28:23
// 環境依存かも知れませんが…

cygwinのlessを見ていて思ったのですが
qで抜けたときにlessが表示していたもの(バッファ?)が消えて
less実行前の画面が復活します

moreなんかだと画面に残ったまま次のプロンプトが出てきます

このlessの動きはどう実装すればいいのでしょうか
setbuf()ってこういうことをする関数じゃないんですよね?
0972デフォルトの名無しさん2005/06/01(水) 23:53:24
環境依存だ。
0973デフォルトの名無しさん2005/06/01(水) 23:54:04
>>971
termcapを見て、プログラムの開始時に ti、終了時に te を
出力すればいい。
0974デフォルトの名無しさん2005/06/02(木) 00:26:05
スーパー初心者の疑問です。

コマンドラインでいくつかのファイル名を引数に取り、
プログラム中でそれらのファイルをオープンして処理をする、
というCプログラムを書く場合があるとします。

このとき、コマンドラインで渡される引数が毎回実行ごとに違うとき、
プログラムではどのようにファイルオープンを繰り返せばよいのでしょうか?
単純にやる方法なら思い浮かびますが、何か目が覚めるような手があればぜひ教えてください。
0975デフォルトの名無しさん2005/06/02(木) 00:27:55
補足です。
引数が違うというのは、引数の数が毎回異なる、ということです。
3個のファイルを引数にとる場合もあれば、1個のときもある、という状況です。
0976デフォルトの名無しさん2005/06/02(木) 00:28:28
>>974
単純にやる方法をまず書いてみなさい。
0977デフォルトの名無しさん2005/06/02(木) 00:31:28
プログラムは殆どの場合、単純な方法が一番良い。
変に凝った方法はバグも混入しやすく保守しにくく拡張しづらい。
0978デフォルトの名無しさん2005/06/02(木) 00:34:45
>>975

int main(int c, char **v)
{
int i;
for(i=1; i<c; i++)hoge(v[i]);
return 0;
}
0979デフォルトの名無しさん2005/06/02(木) 00:53:40
K&Rの53ページ  10進数列をそれに等しい数値に変換する関数atoi

/* atoi: sを整数に変換する*/
int atoi(char s[])
{
int i, n;

n = 0;
for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i)
n = 10 * n + (s[i] = '0');
return n;
}

n = 10 * n + (s[i] = '0');
ここの意味がわからないです。教えてください。
0980デフォルトの名無しさん2005/06/02(木) 00:57:14
ありがとうございます

>>972
やっぱりですか…

>>973
>termcapを見て
termcapってのは/usr/include/termcap.hですか?
何か出力してくれそうな関数はtputs()??
ちょっと見てみます

// でも引数が3つもありますね…
// tiもteも宣言無いし…
0981デフォルトの名無しさん2005/06/02(木) 00:57:22
(s[i] - '0')
の間違いじゃねえの?
もしそうなってるとしたら誤植だと思うが
0982デフォルトの名無しさん2005/06/02(木) 00:59:03
>>979
もとの数を10倍して次の桁の数字を足す

"123"
最初は1
次が12
最後に123

return 123;
09839822005/06/02(木) 00:59:57
>>981
そういうことですかい…
スマネ
0984デフォルトの名無しさん2005/06/02(木) 07:14:12
>>980
環境依存。Unixスレにでも行ってくれ。
09859792005/06/02(木) 08:07:44
>>981
間違えです。すいません。

× n = 10 * n + (s[i] = '0');
○ n = 10 * n + (s[i] - '0');


あらためて教えてください。
09869792005/06/02(木) 08:10:55
上に書いてました。

>>982
わかりました。ありがとうございます。

>>985
>あらためて教えてください。

間違え

0987デフォルトの名無しさん2005/06/02(木) 09:21:44
自分の頭の中で(チラシの裏でもいいや)
実際にパラメタ入れて動作させてみろよ
0988デフォルトの名無しさん2005/06/02(木) 09:31:46
わからないときはループ内を追ってみればいい。

10*nで10進数として桁をシフトアップ、
+(s[i] - '0')で一桁分の数字を加算(ASCIIコードとしての数字→数に変換)
0989デフォルトの名無しさん2005/06/02(木) 14:07:09
もしかして次スレまだか?
俺が2回連続で立てるか。
まとめサイトは更新中断してるけどとりあえずこのままでいいのかな
0990デフォルトの名無しさん2005/06/02(木) 14:38:58
C言語なら俺に聞け! Part 108
http://pc8.2ch.net/test/read.cgi/tech/1117690676/
0991デフォルトの名無しさん2005/06/02(木) 16:11:02
>>1
Cってなに
099212005/06/02(木) 16:49:24
>>991
知らん
0993デフォルトの名無しさん2005/06/02(木) 18:32:52
>>991
セクースのこと
0994デフォルトの名無しさん2005/06/02(木) 18:35:28
おい!おまいら!
float型の変数のスワップ方法教えてください。
おながいします。ホント困ったorz。
0995デフォルトの名無しさん2005/06/02(木) 18:37:30
#deifne swapf( a, b) do{\
float t = a;\
b = a;\
a = t;\
}while(0)
では何か不満?
0996デフォルトの名無しさん2005/06/02(木) 19:17:12
>>995
それではtの定義が関数の先頭に来ない。C89には則っていない。
C99やC++のコンパイラでは通るが、純粋なC89コンパイラでは通らない。
ということで>>994は関数で実装した方がよい。
0997デフォルトの名無しさん2005/06/02(木) 19:28:27
>>991
アルファベット
0998デフォルトの名無しさん2005/06/02(木) 19:29:13
>>996
関数の先頭じゃなくてもブロックの先頭ならいいんじゃないか?
0999デフォルトの名無しさん2005/06/02(木) 19:30:24
もっとも、引数に t を渡されたら死ぬが
1000デフォルトの名無しさん2005/06/02(木) 19:30:54
1000なら町プログラマーw
     ↑
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。