08/05/03 22:09:21
>>257-259
お早いレスありがとうございます。
やりたいことは確かに>>259の通りなのですが、
他の関数でinfoを門番までスキャンさせたくて、門番としてNULLを割り当てようとしました。
ちょうどコマンド引数のargv[argc]に'\0'が入っているような感じに使おうと思っているのです。
>>259のようにしてしまうと、他の関数ではinfoのメンバーを知らなくてはなりません。
質問では触れなかったのですが、検索用の関数を作っています。
最終的には、main()側でstr_search()や,infoの内容を見る関数をラップした関数を使えるようにするだけで、
他の部分は全てヘッダファイルに移し、隠蔽してしまおうと考えていました。(言葉足らずですみません)
つまりinfoは作業用変数としたいのです。
関数の設計も含めて、何か良い方法がありましたら教えていただけないでしょうか。
263:デフォルトの名無しさん
08/05/03 22:11:47
最後の要素のcolかlineに特別な値を割り当てておくしかないだろう
264:デフォルトの名無しさん
08/05/03 22:14:33
>>262
できない。
infoが配列の要素を指している以上、
その値は必ず配列上に存在する要素へのポインタにしかなりえない。
265:デフォルトの名無しさん
08/05/03 22:16:02
あとはline_cntを公開しておくしかないな
こーゆーことやるならC++のほうが圧倒的に楽だけどね…
266:デフォルトの名無しさん
08/05/03 22:18:13
>262
文字列の最後を\0で検出できるのは、\0が文字型の特殊な値だから。
同じように任意の型の配列の末尾を検出したいなら、特殊な値を割り当てて検出する以外にない。
267:デフォルトの名無しさん
08/05/03 22:22:50
どうしてもやりたいなら、 match_infoの配列ではなく、
match_infoのポインタの配列を使う。
match_info **info;
info=(match_info **)malloc((line_cnt+1) * (sizeof(match_info *)));
for(i=0;i<line_cnt;i++)
info[i]=(match_info *)malloc(sizeof(match_info));
info[line_cnt]=NULL;
こうすれば出来るけど、当然一個一個freeする手間がかかる。
268:デフォルトの名無しさん
08/05/03 22:24:02
>>262
argv[argc]は'\0'ではなくNULLな。
これはargvがポインタの配列だから実現できる。
infoはmatch_info型の配列だから、
末尾要素をNULLにしようとしても型が違う。
269:デフォルトの名無しさん
08/05/03 22:28:56
>>256
それはもしかするとこう?
match_info** info; // ← match_info の配列ですね?
{
info = (match_info**)malloc(line_cnt+1)*szeof(match_info));
int i;
for(i = 0; i < line_cnt + 1; i++)
info[i] = NULL+
// ...
270:デフォルトの名無しさん
08/05/03 22:30:16
>>267
ががん。かぶってしもた・・
271:デフォルトの名無しさん
08/05/03 22:33:43
構造体の中身を公開したくないのに構造体の内容で判定することはできない。
公開するか、ポインタの配列で実現するかの二択。
272:デフォルトの名無しさん
08/05/03 22:57:51
>>263-271
みなさんありがとうございます。
argv[]がargv[argc]までスキャンされるのは、
argv[]が文字列の"ポインタ"だからですね。勘違いしていました。
>>267>>269でおっしゃられているようにポインタ配列で実装しようと思います。
>>267>>269のようにmalloc()がネストされている場合は、
中をfree()してから外側をfree()しなければなりませんか?
手間がかかるようなら、>>263,265も考えてみようと思います。
273:デフォルトの名無しさん
08/05/03 23:07:18
|>>267>>269のようにmalloc()がネストされている場合は、
|中をfree()してから外側をfree()しなければなりませんか?
もちろん
274:デフォルトの名無しさん
08/05/03 23:17:03
正規表現のアルゴリズムを勉強したいんスけど、なんかグレートなテキストってないっスかねぇ~?
275:デフォルトの名無しさん
08/05/03 23:23:46
>>274
エディタのマニュアルに書いてないかな
276:デフォルトの名無しさん
08/05/03 23:27:29
>>274
grepのソース
277:デフォルトの名無しさん
08/05/03 23:34:41
>>274
URLリンク(www.amazon.co.jp)
この本に一章だけ書いてある。
本自体は有名だけど、この説明がいいかどうかは判断できない。
278:デフォルトの名無しさん
08/05/03 23:40:46
>>277
レビューワロタ
参考にしてる人多すぎだろ
279:デフォルトの名無しさん
08/05/03 23:40:52
「詳説 正規表現」のコラムでも、正規表現をさらに学びたい人は >>277 の三章を進めると書いてあるな。
280:デフォルトの名無しさん
08/05/04 00:05:26
せっ・・・性器表現の勉強を(ry お勧めの参考書を(ry
281:デフォルトの名無しさん
08/05/04 00:21:41
>>274
手元にある本をあげておきます。
オートマトン・言語理論, 富田悦次・横森 貴, 森北出版 1992, ISBN4627805500
これがベストというわけではありませんが、まず理論的な部分をしっかりおさえておかないと、後々どうにもならなくなると思います。
282:デフォルトの名無しさん
08/05/04 03:45:27
#include のことを、シャープインクルードって言っていた香具師、手を上げろ! ノシ
283:デフォルトの名無しさん
08/05/04 03:50:06
えっ、違うの!?
284:デフォルトの名無しさん
08/05/04 03:52:10
本場の職人なら、パウンド・インクルードという。
285:デフォルトの名無しさん
08/05/04 03:52:32
# #は井桁、ナンバーサインでシャープは♯なんだな。
斜めになっているのが縦棒か横棒か、違うんだなぁ。
シャープは楽譜の記号で使われているんだなぁ。
ぼぼぼ、僕はおにぎりが欲しいんだなぁ。
286:デフォルトの名無しさん
08/05/04 04:18:42
C#とかあるし、シャープで伝わるからそう読んでるな
むしろ井桁とかだと通じないことがあるし
287:デフォルトの名無しさん
08/05/04 04:29:29
シーナンバー・・・うむ・・・いや、いや、そうじゃなくて、C♯はちゃんと
シャープと書かれているんでしょう。同一視してはならぬ、決して。
288:デフォルトの名無しさん
08/05/04 04:35:23
C#は間違いなく井桁だな
まぁシャープの代わりに井桁を使っているから、井桁をシャープと読むのは不適切かも知れないが
井桁が通じないことがあるんだからしょうがない
もっと普及させてこい。話はそれからだ
289:デフォルトの名無しさん
08/05/04 04:42:53
♯の半角が存在しないから、代用しているのさ・・・そう思いたい・・・きっとそうだ。
♯を英語圏にも広めよう!
290:デフォルトの名無しさん
08/05/04 07:35:58
>>284
マジなのか
どうでもいいけど
URLリンク(cplusplus.syntaxerrors.info)
291:デフォルトの名無しさん
08/05/04 09:46:44
英語だといろんな呼ばれ方があるみたいだ。「シャープ」も含めて。
URLリンク(en.wikipedia.org)
292:デフォルトの名無しさん
08/05/04 10:17:44
値のビット列表示をしたいのですができません
共用体とビットフィールドを使って実現しようと思ったのですができませんでした
下のプログラムだとどこがだめなんでしょうか?
#include <stdio.h>
int main(void){
union bits{
char ch;
unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
} bits;
bits.ch = 'a';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
bits.ch = 'b';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
bits.ch = 'c';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
return 0;
}
/*
実行結果:
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
*/
293:デフォルトの名無しさん
08/05/04 10:18:38
fgets(str, 32, fp);
こんな感じに書いたときに、
strの宣言がcharの配列だったらいいけど、
charへのポインタだったらだめだった。どうして?
294:デフォルトの名無しさん
08/05/04 10:31:08
>>293
運が悪くポインタの指す先が書き換えてはいけない場所だったから
295:デフォルトの名無しさん
08/05/04 10:54:19
>>292
a, b, c, d, e, f, g, h が union で共用されているから
#include <stdio.h>
int main(void){
union bits{
char ch;
struct{
unsigned a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
};
} bits;
bits.ch = 'a';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
bits.ch = 'b';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
bits.ch = 'c';
printf("%d %d %d %d %d %d %d %d\n", bits.a, bits.b, bits.c, bits.d, bits.e, bits.f, bits.g, bits.h);
return 0;
}
296:デフォルトの名無しさん
08/05/04 10:56:19
>>293
ポインタを初期化していなかったに一票
297:293
08/05/04 11:04:20
>>294
>>296
そうだよね、何処にあるかわからない入れ物を渡してもダメに決まってるよね。
すっきりしますた。
298:デフォルトの名無しさん
08/05/04 11:10:44
>>295
unsigned とかやってるとサイズが4バイトになるから
union bits{
char ch;
struct{
unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
};
} bits;
にしないとマズいかもしれない。
ただ、ビットフィールドを含む構造体のサイズは処理系依存なので難しい所だが。
さらに言えばビットフィールドのビットがどちら側から埋められるかは処理系依存だから、
union bits{
char ch;
struct{
#ifdef BITFIELD_LITTLE_ENDIAN
unsigned char h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1;
#else
unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
#endif
};
} bits;
として処理系ごとに切り替えられるようにするのが良い。
299:デフォルトの名無しさん
08/05/04 11:13:03
unsigned char に対応していない処理系を考慮するなら
union bits{
char ch;
struct{
#ifdef BITFIELD_LITTLE_ENDIAN
#ifdef BITFIELD_INT_SIZE
unsigned : sizeof (unsigned int) * CHAR_BIT - 8;
unsigned h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1;
#else
unsigned char h:1, g:1, f:1, e:1, d:1, c:1, b:1, a:1;
#endif
#else
#ifdef BITFIELD_INT_SIZE
unsigned a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
#else
unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
#endif
#endif
};
} bits;
とすることになるが、この共用体のサイズが1であることは期待できない。
300:デフォルトの名無しさん
08/05/04 11:28:45
>>295,298,299
ビットフィールドが全部同じ位置を使っていたということですね
プリプロセッサディレクティブは未学習なのですが、イメージはつかめました
ありがとうございました
301:デフォルトの名無しさん
08/05/04 12:05:18
1ビットしかなくて読むだけなのにビットフィールドの共用体なんてフツー使わねえよ。
#define BIT(val, pos) (((val) >> (pos)) & 1)
int ch;
ch = 'a';
printf("%d %d %d %d %d %d %d %d\n", \
BIT(ch,7), BIT(ch,6), BIT(ch,5), BIT(ch,4), BIT(ch,3), BIT(ch,2), BIT(ch,1), BIT(ch,0));
302:デフォルトの名無しさん
08/05/04 12:08:57
>>301
普通って何さ
303:デフォルトの名無しさん
08/05/04 12:38:48
>>302
普通って普通さ
304:デフォルトの名無しさん
08/05/04 13:43:24
まあ確かにビットマスク使ったほうが楽だな
305:デフォルトの名無しさん
08/05/04 17:45:50
コマンドプロントでテキストファイル.Cをコンパイルするにはどうすればいいの?
パスはしたの通りです。
C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C
C:\Bディレクトリ\コンパイラ
306:デフォルトの名無しさん
08/05/04 18:18:23
> コンパイラ /?
> コンパイラ /H
$ コンパイラ -h
$コンパイラ --help
307:デフォルトの名無しさん
08/05/04 18:53:08
えwどういうことw
308:デフォルトの名無しさん
08/05/04 18:55:18
>>307
コンパイラによって方法が違うからコンパイラのマニュアルを見るか
有名なコンパイラなら名前を書け
309:デフォルトの名無しさん
08/05/04 18:55:53
ヘルプ見ろ
310:デフォルトの名無しさん
08/05/04 19:05:39
え そうなんだ
MinGWなんだけど
311:デフォルトの名無しさん
08/05/04 19:12:19
MinGWならgccかな
> C:\Bディレクトリ\コンパイラ
が気になるけどたぶん
gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C
C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.C
どっちかかもね?
312:デフォルトの名無しさん
08/05/04 19:20:27
gcc --help
と叩けば使いかたが出る。
313:デフォルトの名無しさん
08/05/04 19:31:39
> C:\Bディレクトリ\コンパイラ は C:\TYC4TH\gcc ってことです
その二つでためしたんですが、
gcc C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cの場合
'gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
C:\Bディレクトリ\コンパイラ C:\Users\ユーザー名\Documents\Aディレクトリ\テキストファイル.Cだと
'C:\TYC4TH\gcc' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません
314:デフォルトの名無しさん
08/05/04 19:33:02
ってでます><
315:デフォルトの名無しさん
08/05/04 19:39:10
>>312
なんか英語がたくさんでて意味がわからない・・・
316:デフォルトの名無しさん
08/05/04 19:42:10
日本語を含む場合は""で括る
例)gcc "C:\Bディレクトリ\コンパイラ"
>'gcc' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
gccコマンドのパスが通っていない、正しくない
317:デフォルトの名無しさん
08/05/04 19:49:07
gccインストールしてからMinGWインストールすると
パス通すかの確認があった気がしたけど・・・
MinGWをインストールしなおして確認してみるか、
$HOME/.bashrcにexport PATH=$PATH:コンパイラの入ってるディレクトリ
を追加してみ
MinGWコンパイラの入ってるパスは$HOMEからの相対パスがいいかな
ちなみにMSYSも入れるとうれしくなれるかも
318:デフォルトの名無しさん
08/05/04 19:49:48
>MinGWコンパイラの入ってるパスは
コンパイラの入ってるパスは
訂正
319:デフォルトの名無しさん
08/05/04 19:51:13
>コンパイラの入ってるパスは
コンパイラの入ってるディレクトリは
打つ出し脳
320:デフォルトの名無しさん
08/05/04 19:51:51
MinGW - Minimalist GNU for Windows
OSはWindowsじゃないの?
XP なのか 9x なのかによっても設定方法違うけど
321:デフォルトの名無しさん
08/05/04 19:55:06
c:\autoexec.batに
PATH=c:\MinGWまでのディレクトリ\bin;%PATH%
これを書き込んで再起動すればばよかった、、、はず・・・多分
322:デフォルトの名無しさん
08/05/04 19:57:08
折角隔離スレがあるんだから誘導しろよ。
Cygwin + MinGW + GCC 相談室 Part 3
スレリンク(tech板)
323:デフォルトの名無しさん
08/05/04 20:19:39
おぉ できたかもです!!
みなさんありがとうございます。
さっそく勉強してきます。
324:デフォルトの名無しさん
08/05/04 20:51:46
#include <windows.h>
typedef HRESULT (STDMETHODCALLTYPE *LPFNGETCORSYSTEMDIRECTORY)(LPWSTR, DWORD, DWORD *);
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
WCHAR szBuf[256];
DWORD dwLength;
HMODULE hmod;
LPFNGETCORSYSTEMDIRECTORY lpfnGetCORSystemDirectory;
略
lpfnGetCORSystemDirectory = (LPFNGETCORSYSTEMDIRECTORY)GetProcAddress(hmod, "GetCORSystemDirectory");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (lpfnGetCORSystemDirectory == NULL) {
MessageBox(NULL, TEXT("関数がエクスポートされていません。"), NULL, MB_ICONWARNING);
FreeLibrary(hmod);
return 0;
}
略
}
上記のようなプログラムを見かけましたが波線の部分関数ポインタの動作いまいち理解できません。
どなたかご教示お願いします。
325:デフォルトの名無しさん
08/05/04 21:53:20
>>293
以下の記述で普通に動作しています。
環境 cygwin/WindowsXP, 処理系 gcc 3.4.4
#include <stdio.h>
#define N 1024
int main()
{
char buffer[N], *p;
p = buffer;
fgets(p, N, stdin);
printf(">%s", p);
return 0;
}
/* end */
動作しないソースと環境・処理系を教えていただければ、何かわかるかもしれません。
326:325
08/05/04 21:54:30
失礼、解決ずみでした。
327:デフォルトの名無しさん
08/05/05 01:40:56
>>324
関数ポインタとは動作するものではありません
もう少し質問内容を吟味してくださらないと答えようがありません
328:デフォルトの名無しさん
08/05/05 04:08:44
>>81ってどうやるのかな
329:デフォルトの名無しさん
08/05/05 06:47:41
>>324
何を聞きたいのか今ひとつわからんが、とりあえずMSDN。
URLリンク(msdn.microsoft.com)(VS.80).aspx
330:デフォルトの名無しさん
08/05/05 13:03:48
>>324
GetProcAddress は指定した関数へのアドレスを返すんだけど、
GetProcAddress の戻り値の型は1つに定めないといけないので
GetProcAddress は関数へのアドレスをとりあえず FARPROC って型にして返すようにしてある。
実際にこの関数のアドレスを使う際には、
本来の関数ポインタ型へとキャストして使う必要がある。
331:デフォルトの名無しさん
08/05/05 14:15:49
stdlib.hにあるsystem関数って、標準ですか?
どの処理系でもまともな動作が期待できる?
332:デフォルトの名無しさん
08/05/05 15:04:12
>>331
プログラマを目指すならもちとあいまいな問いにならないよう気をつけないと。
質問がとんでもなく飛んでいる。
どの処理系・・・列記してみて
まともな動作・・まともってなによ(この質問はちょっとあほっポイ匂い)
333:デフォルトの名無しさん
08/05/05 15:19:24
>>331
標準じゃない
334:デフォルトの名無しさん
08/05/05 15:25:08
>>324
このソースって凄いね(大文字ばっかで・・・w)
関数のポインターについてだけど
ポインターはアドレスを示すのは判りますね。
int body1(char* mes)
{
printf("body1 : %s¥n", mes); return 0;
}
int body2(char* mes)
{
printf("body2 : %s¥n", mes); return 0;
}
{
int (*func)(char*);
func = body1;
func("message");
func = body2;
func("message");
}
みたいな。
lpfnGetCORSystemDirectory は関数へのポインターを示すけど希望するのがなければ NULL。
あとlpfnGetCORSystemDirectory() として適当に引数与えて呼び出せばいいということかな。
335:デフォルトの名無しさん
08/05/05 15:57:10
>>331
関数そのものは標準であり、
どの処理系であろうと「処理系の考えるところのまともな動作」をする
それが「プログラマの期待するところの動作」と一致するかはわからない
336:デフォルトの名無しさん
08/05/05 16:02:52
ここのレス見ても何も分からないほどの初心者ですが教えてほしいことがあります。
課題でこのプログラムを組まないといけないのですが、全く分かりません。
問、二次元配列のプログラムを利用し、行列の積を計算するプログラムを作成せよ。
ただし行列a,bは以下のものを使用する。
|0 1 2| |0 3 6|
a=|3 4 5| b=|1 4 7|
|6 7 8| |2 5 8|
aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。
337:デフォルトの名無しさん
08/05/05 16:12:06
>>336
>aの一列目とbの1,2,3行目をかけるのがどうすればいいかわかりません。
行列の積の定義から勉強しような。
行と列が逆だと思うぞ。
338:デフォルトの名無しさん
08/05/05 16:23:36
>>337
すいません。丁寧に指摘してくださってありがたいです。
一応僕が作ったプログラムを載せておきます。
#include<stdio.h>
main(){
int a[3][3]={{0,1,2},{3,4,5},{6,7,8}};
int b[3][3]={{0,3,6},{1,4,7},{2,5,8}};
int c[3][3]={0};
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++)
c[i][j]=a[i][j]*b[i][j];}
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%d ",c[i][j]);
printf("\n");
}}
足し算をするプログラムの演算子を+から*に変えただけなので積が出来るわけもないのですが、
どうすればよいのでしょうか、あつかましいですがよろしくお願いします。
339:側近中の側近 ◆0351148456
08/05/05 16:28:36
(っ´▽`)っ
#include <stdio.h>
int main(void)
{
int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}};
int ab[3][3];
int i;
int j;
int k;
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
ab[i][j] = 0;
for(k = 0; k < 3; k++){
ab[i][j] += (a[i][k] * b[k][j]);
}
}
}
return 0;
}
答えは{{5, 14, 23}, {14, 50, 86}, {33, 86, 149}
340:デフォルトの名無しさん
08/05/05 16:29:04
>>338
行列の掛け算は3重のループになるのだぞ。行列を勉強しましょう。
341:デフォルトの名無しさん
08/05/05 16:30:14
for(n = 0; n < 3; n++){
for(m = 0; m < 3; m++){
for(i = 0; i < 3; i++) c[n][m] += a[n][i] * b[i][m];
}
}
こんな感じ?
342:側近中の側近 ◆0351148456
08/05/05 16:33:49
>>338
(っ´▽`)っ
x行n列の行列Aのi行j列成分をa(i, j)、
n行y列の行列Bのi行j列成分をb(i, j)、
ABのi行j列成分をab(i, j)と表示するとき、
ab(i, j) = Σ(k=1→n)a(i, k)b(k, j)
線形台数の教科書を見直せ☆
343:デフォルトの名無しさん
08/05/05 16:51:00
>>339->>342
初歩的なことなのにわざわざ教えてくださってありがとうございます。
感謝しています。
あとほんとに初心者的なことなんですが、>>339さんのプログラムで計算は出来ました。
しかし答えを表示させようと思ったら、なんか変な結果になりました。
以下プログラムと結果です。
(最初のほうは省略)
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
ab[i][j] = 0;
for(k = 0; k < 3; k++){
ab[i][j] += (a[i][k] * b[k][j]);
printf("%d ",ab[i][j]);}
}
}
return 0;
}
結果
0 1 5 0 4 14 0 7 23 0 4 14 9 25 50 18 46 86 0 7 23 18 46 86 36 85 149
344:デフォルトの名無しさん
08/05/05 16:52:39
>>342
ゆとり乙
数学3cのレベルです
345:344
08/05/05 16:54:36
>>342
ごめんなさいゆとりは俺でした
数学3cじゃねええええええええええ
あああああああああああああ何か勘違いしてたああああああああ
346:344
08/05/05 16:55:21
やべえ今までで一番恥ずかしい書き込みだ
347:デフォルトの名無しさん
08/05/05 16:55:51
最近Cを始めた者なんですが
CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
ポインタを使うような関数を自分で作る必要がありますか?
何かサンプルなどもありましたらお教えください。
348:336
08/05/05 16:55:51
僕はちなみに本当のゆとりです。
349:デフォルトの名無しさん
08/05/05 16:56:55
落ち着け
寿司食うか?
350:344
08/05/05 16:58:16
大体3cとかあんまりやってねぇんだよ・・・
ケーリーはミルトンの公式ばっかり使って足し算引き算ぐらいだっけ?
行列式はなかったよな・・・あぁ・・・俺なにやってんだろう
351:デフォルトの名無しさん
08/05/05 16:58:59
> ab[i][j] += (a[i][k] * b[k][j]);
> printf("%d ",ab[i][j]);}
~~~
中括弧の位置
352:側近中の側近 ◆0351148456
08/05/05 17:03:14
>>343
(っ´▽`)っ
printfを最も内側のループの外に出せ☆
#include <stdio.h>
int main(void)
{
int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
int b[3][3] = {{0, 3, 6}, {1, 4, 7}, {2, 5, 8}};
int ab[3][3];
int i;
int j;
int k;
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
ab[i][j] = 0;
for(k = 0; k < 3; k++){
ab[i][j] += (a[i][k] * b[k][j]);
}
printf("%d\t", ab[i][j]);
}
printf("\n");
}
return 0;
}
353:344
08/05/05 17:05:08
ああああああああああああああああああああああ
354:344
08/05/05 17:06:41
ダメだ・・・
355:デフォルトの名無しさん
08/05/05 17:08:02
五月蝿い
トイレでも篭ってろ
356:344
08/05/05 17:08:42
線形台数の教科書読んできますノシ
357:デフォルトの名無しさん
08/05/05 17:10:23
>>347
>CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
ない
>ポインタを使うような関数を自分で作る必要がありますか?
ある
文字列操作の概念自体が違うので、CでVBのようなことをやるという考え自体を捨てること
まずCのやりかたというものを覚えるのが先
358:側近中の側近 ◆0351148456
08/05/05 17:12:08
>>347
(っ´▽`)っ
b = LEFT(a, n)
は
strncpy(b, a, n);
b[n] = '\0';
b = MID(a, m, n)
は
strncpy(b, &a[m-1], n-m+1);
b[n-m+1] = '\0'
で。
359:側近中の側近 ◆0351148456
08/05/05 17:13:30
(っ´▽`)っ
最後セミコロンが抜けたが気にしない☆
360:デフォルトの名無しさん
08/05/05 17:14:05
>>347
>CってVBにあったLEFTやMIDに当たる関数はないのでしょうか?
どちらもsprintf()で代用可能。
361:336
08/05/05 17:14:14
>>351->>352
おかげさまでうまく答えも出ました。本当にありがとうございます。
362:344
08/05/05 17:14:54
>>361
俺と一緒に勉強しようぜ
363:347
08/05/05 17:17:36
>>357-360
ご回答ありがとうございました。
サンプルを参考にしながらC勉強をしていきます。
364:側近中の側近 ◆0351148456
08/05/05 17:23:39
(っ´▽`)っ
正確には
(っ´▽`)っ
b = LEFTB(a, n)
は
strncpy(b, a, n);
b[n] = '\0';
b = MIDB(a, m, n)
は
strncpy(b, &a[m-1], n-m+1);
b[n-m+1] = '\0';
だ。
strncpyの第3引数はバイト数。
LEFTとMIDを使いたければwcsncpyを使えばいいような気がする。
365:336
08/05/05 17:35:16
>>362
共にがんばりましょう。
366:デフォルトの名無しさん
08/05/05 17:44:26
unsigned __int32 hentai, doutei;
hentai = 293317826;
doutei = 899523;
仮に上のように hentai と doutei に格納された数値において、
hentai += doutei; // 293000000 + 899253
のように hentai の下6桁を0にして doutei を加算し、下6桁を doutei にしたい。
条件は
if ( hentai > doutei &&
doutei >= 0 &&
doutei < 1000000)
で、思いついたのが
hentai = ((hentai / 1000000) * 1000000) + doutei;
納得がいかないのでスマートなやり方教えてくれ。
367:デフォルトの名無しさん
08/05/05 17:50:49
>>366
十分スマートと思うが、どういう点で納得がいかないんだ。
hentai += doutei - hentai % 1000000;
368:デフォルトの名無しさん
08/05/05 17:58:57
>>367
おお、サンクス。
除算か乗算どちらかを一回でも削りたかったんだ。
369:デフォルトの名無しさん
08/05/05 21:57:45
>>363
Basic系から来た人だと right とかも使うんでしょw・・それは置いといて無いものは自作するってのも楽しみじゃないかいな?
>>360
参考までに書いてくれると周りも参考になるとおもう。
せいぜい数行だと思うから sprintf で書いてみてよ。
370:デフォルトの名無しさん
08/05/05 22:12:13
>>369
360じゃないが、こうじゃないかな。
char* left(char *dst, const char *src, int count)
{
sprintf(dst, "%.*s", count, src);
return dst;
}
char* mid(char *dst, const char *src, int pos, int count)
{
return left(dst, src+pos, count);
}
371:デフォルトの名無しさん
08/05/05 23:40:11
C言語用でお勧めのフリーコンパイラを教えてください
372:デフォルトの名無しさん
08/05/05 23:43:44
>>370
おお、%.*s ・・・しらなんだ。
373:デフォルトの名無しさん
08/05/05 23:47:34
>>371
・ GCC (MinGW)
・ Microsoft Visual C++ Express Edition 2008
好きなの選べ
374:デフォルトの名無しさん
08/05/06 00:05:01
>>373
その2つの違いがまったくわかりません…
それとMSの方はC++となってますがC言語にも対応してるんですか??
375:デフォルトの名無しさん
08/05/06 00:08:44
おまえは紹介されたコンパイラについてちゃんと調べたのか?
376:デフォルトの名無しさん
08/05/06 00:09:31
>>374
MSのコンパイラでもCのコンパイルはできます。但し、99年の規格にさえ準拠していないので注意が必要です。
gccは、Cコンパイラではなくコンパイラコレクションです。勿論、CもC++もコンパイルできます。
まぁ、MinGWにしろCygwinにしろ、環境に対する知識が必要にはなります。
377:デフォルトの名無しさん
08/05/06 00:24:49
fputc( )の使い方の説明で
int fputc(int 文字、FILE *ストリーム);
fputc( )関数は、「文字」の下位バイトを、「ストリーム」に結び付けられているファイルにunsigned char型の値として書き込みます。
とあるんですが、上位バイトはどうなるんですか?
378:デフォルトの名無しさん
08/05/06 00:25:59
捨てられる
379:デフォルトの名無しさん
08/05/06 00:26:49
URLリンク(www.bohyoh.com)
380:デフォルトの名無しさん
08/05/06 08:01:36
vistaで動くコンパイラだったら何がいい?
やっぱりbcc、gcc辺りかな
381:デフォルトの名無しさん
08/05/06 09:42:29
VC++ 2008 Express Edition
382:デフォルトの名無しさん
08/05/06 09:53:56
uint16 とか uint8 とかは int とどう違うのですか?
使い方を教えてください。
383:デフォルトの名無しさん
08/05/06 09:54:04
Express Editionとgccの好きな方
384:デフォルトの名無しさん
08/05/06 09:56:25
uint16_t や uint8_t なら標準(C99)で用意されているが
uint16 や uint8 は標準では用意されていない。
385:382
08/05/06 09:59:52
>>384
もう少し詳しくお願いします。
386:デフォルトの名無しさん
08/05/06 10:11:53
>>385
標準で用意されてない以上、
ヘッダファイル内にある定義を見てくださいとしか言いようが無い。
387:382
08/05/06 10:22:11
>>386
ということは・・・
uint16 uint8 はwindows.hとかでも定義されてる分ではなく、
自分の使っているライブラリかなにかで定義されているということですね。
わかりました。 調べてみます。
388:デフォルトの名無しさん
08/05/06 10:24:30
>>387
windows.hにあるかもしれませんが、そこにあったとしても標準とは言えません。
そもそも、あなたがWindowsを使っているのかどうか誰にもわかりませんから。
389:デフォルトの名無しさん
08/05/06 10:25:09
処理系独自に定義されてるかもしれないが、
どの処理系使ってるかも知らんし、
結局自分で調べてくれ、というこった。
390:デフォルトの名無しさん
08/05/06 13:51:05
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram hist);
int main (void){
struct histgram hist;
int z;
hist.x = 0;
for(z=0;z<100;z++){
hist.y[z]=0;
}
printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
one(hist);
printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
for(z=0;z<9999999999;z++);
return 0;
}
void one(hist){
two(hist);
void two(hist){
int z;
hist.x = 1;
for(z=0;z<100;z++)hist.y[z]=1;
}
とするとtwo(hist)でエラーが起きます。なぜでしょうか?
391:デフォルトの名無しさん
08/05/06 13:57:38
すいません、解決しました。
392:デフォルトの名無しさん
08/05/06 14:00:16
INT_MAX 4bites = 2147483647 < 9999999999
393:デフォルトの名無しさん
08/05/06 14:02:26
やっぱうまくいきません。
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram hist);
int main (void){
struct histgram hist;
int z;
hist.x = 0;
for(z=0;z<100;z++){
hist.y[z]=0;
}
printf("before***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
two(hist);
printf("after***%d***%d***%d***",hist.x,hist.y[0],hist.y[50]);
for(z=0;z<9999999999;z++);
return 0;
}
void two(struct histgram *hist)
{
int z;
hist->x = 1;
for(z=0;z<100;z++){
hist->y[z]=1;
}
}
は何がいけないのでしょうか?
394:デフォルトの名無しさん
08/05/06 14:04:25
two()は構造体のポインタを受け取る関数
main()で呼んでるtwo()に渡されてるhistは構造体そのもの
あと>392
395:デフォルトの名無しさん
08/05/06 14:06:22
bites …くそorz
396:デフォルトの名無しさん
08/05/06 14:11:21
Winでコマンドプロンプトがすぐ終了するのを抑止したいなら、scanf("%*s"); がいい
397:393
08/05/06 14:11:59
URLリンク(www9.plala.or.jp)
ここに、393のようにかけと書いてありました…
393を書き直した正解はどうなるのでしょうか?
グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
処理された任意の変数をn個、n-1個上の階層で使用したいのですが
398:393
08/05/06 14:12:39
>396
ありがとうございます。使ってみます。
399:デフォルトの名無しさん
08/05/06 14:17:24
#define ZETTAI(x) (x < 0) ? -(x) : x
int x;
x = ZETTAI(-9 - 50) + 5;
これでxの中身が59になってしまうのですが、何故でしょうか?
-59をZETTAIで59にした後、5を加算しているはずなのですが
400:デフォルトの名無しさん
08/05/06 14:17:47
>>.397
そこの二つ目のの「seito2」は構造体の配列名。配列名は大抵の場合すぐポインタに成り下がるので、
ポインタを引数としてとるseidesp2()にそのまま渡すことができる。
>>393 の場合histは構造体の単体だから、two(&hist) として呼び出さなければならない。
>グローバル変数を使わずに、n個上の階層から任意の変数を↓に投げて、returnすることなく
>処理された任意の変数をn個、n-1個上の階層で使用したいのですが
言ってる意味がよくわからないが、1つの構造体のデータを再帰的に処理したいのなら構造体のポインタを渡す。
401:デフォルトの名無しさん
08/05/06 14:21:07
コンパイラのエラーメッセージをちゃんと読め。
プロトタイプ宣言と定義が噛み合っていないぞ。
void two(struct histgram hist);
void two(struct histgram *hist)...
402:デフォルトの名無しさん
08/05/06 14:23:09
>>399
x = ZETTAI(-9 - 50) + 5;
↑は↓のように展開されるから。
x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;
これはもちろん
x = (-59 < 0) ? 59 : -54;
と解釈されて、xには59が代入される。
マクロZETTAIの正しい宣言は下のようになる。
#define ZETTAI(x) ((x < 0) ? -(x) : x)
もちろん自作などせずにライブラリ関数を使うことが望ましい。
403:デフォルトの名無しさん
08/05/06 14:23:31
>>399
#define ZETTAI(x) (x < 0) ? -(x) : x
を
#define ZETTAI(x) (((x) < 0) ? -(x) : (x))
にしておてきなさい。
404:デフォルトの名無しさん
08/05/06 14:30:39
>>402-403
上手くいきました
ありがとうございます
ですが、
>x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5;
同じxなのに何故一番右のxだけに+5がくっつくのですか?
405:393
08/05/06 14:30:43
すいません、結構理解に手こずってます。
配列でなく、実体を受け渡しする場合は、
struct histgram{
int x;
int y[100];
};
void one(struct histgram hist);
void two(struct histgram *hist);
int main (void){
struct histgram hist;
int z;
hist.x = 0;
printf("before***%d***%d***%d***",hist.x);
one(&hist);
printf("before***%s***%s***%s***",hist.x,hist.y[0],hist.y[50]);
return 0;
}
void one(struct histgram hist){
two(&hist);
}
void two(struct histgram *hist){
int z;
hist->x = 1;
}
だと思ったのですが、error C2440: '関数' : 'histgram *__w64 ' から 'histgram' に変換できません。
というエラーが出てしまいました。
406:デフォルトの名無しさん
08/05/06 14:36:01
>>404
元のx=の式の一番右の+5がそのまま残っているだけ。
407:デフォルトの名無しさん
08/05/06 14:36:58
>>405
構造体をそのまま渡したいのであれば、アンパサンドをつけてはいけません。
408:デフォルトの名無しさん
08/05/06 14:40:42
>>406
つまり
#define ZETTAI(x) (x < 0) ? -(x) : x を
#define ZETTAI(x) ((x < 0) ? -(x) : x) に変えると
x = (-9 - 50 < 0) ? -(-9 - 50) : -9 - 50 + 5; が
x = ((-9 - 50 < 0) ? -(-9 - 50) : -9 - 50) + 5; になるということですね?
#define ZETTAI(x) (((x) < 0) ? -(x) : (x)) だと
x = (((-9 - 50) < 0) ? -(-9 - 50) : (-9 - 50)) + 5; ですね!
理解できました
丁寧にありがとうございました
409:デフォルトの名無しさん
08/05/06 14:40:56
まぁ、あんなサイトを見ているようじゃいつまでたっても理解できないわな。
410:デフォルトの名無しさん
08/05/06 16:29:22
いいから黙ってstdlib.h::abs()を使え
411:デフォルトの名無しさん
08/05/06 16:49:43
やっぱ自作するより、ライブラリ探したほうがいいのかな
412:デフォルトの名無しさん
08/05/06 16:56:26
absはintだから・・・
413:デフォルトの名無しさん
08/05/06 16:56:59
そりゃそうだが基本的なパーツの使い方を勉強してる初心者にそれは野暮な突込みだ。
414:デフォルトの名無しさん
08/05/06 22:00:03
>>399
悪いことはいわん。inline 使え。
#define は C言語ではない・・マクロは副作用があるからうっかり a++ なんて記述したら・・判るでしょ?
415:デフォルトの名無しさん
08/05/06 22:03:58
inline は C99 からだから
416:デフォルトの名無しさん
08/05/06 22:56:05
>>415
そ、そんなこといいだしたら・・・今から始めるなら新しいツール使おうよって Linux も *BSD も Darwin も普通にクリアしてるし。Windows は今一つ判らないけどまさかそうじゃないの?
417:デフォルトの名無しさん
08/05/06 23:00:59
VC++ は C89 だ
418:デフォルトの名無しさん
08/05/06 23:03:14
まぁ、最適化を当てにして関数にしておけってのはありだがな。
419:デフォルトの名無しさん
08/05/07 08:24:58
すみません質問させてください。
入門書見て書いてるんですが
#include <stdio.h>
int astoi(const char s[])
{
int i;
int number = 0;
for(i = 0; s[i] >= '0' && s[i] <= '9'; i++)
number = 10 * number + (s[i] - '0');
return(number);
}
int main(void)
{
char x[]= "1234";
printf("%d", astoi(x));
return(0);
}
という文字型を数値に変えるプログラムで、
number = 10 * number + (s[i] - '0');
のところで (s[i] - '0') とあるんですがこれはどういう意味なんでしょうか?
この部分を消してみると、変な結果になることは確認したのですが・・・すみません教えてください。
420:デフォルトの名無しさん
08/05/07 09:07:44
>>419
文字を数値へ変換してる
asciiコードとかがポイント
421:デフォルトの名無しさん
08/05/07 11:06:21
誰か>>414の
>#define は C言語ではない
の意味を説明してくれないか?
422:デフォルトの名無しさん
08/05/07 11:12:54
>>421
プリプロセッサの範疇だと言うことだろ。
423:デフォルトの名無しさん
08/05/07 12:12:00
>>419
s[i]というのは文字コードが格納されている
'0'というのも、数値の0ではなくて文字0の文字コードが格納されている
'1'は'0'より文字コードが一つ大きいんだ
つまり'1'から'0'を引けば数値の1が返るという仕組み
424:デフォルトの名無しさん
08/05/07 13:12:40
>>419
ASCIIコード表をみると423さんの言ってることがよりわかりやすい思うよ!
ASCIIのコード表はググってもあるだろうし、参考書にも載ってると思う。
425:デフォルトの名無しさん
08/05/07 13:49:07
コンパイラが扱う範疇ではないがC言語の範疇には入るんじゃまいか?
426:419
08/05/07 14:49:58
asciiコード!そういう仕組みなんですか・・・僕友達いないんで、ここで聞かなければ絶対わかりませんでした。
レスしてくれたみなさん、ありがとうございました!
427:デフォルトの名無しさん
08/05/07 15:49:27
プリプロセッサも、C標準に規定されている訳だし、
C言語の一部と考えてもいいんじゃないかな。
プリプロセッサがなきゃコメントすら書けん
428:デフォルトの名無しさん
08/05/07 15:50:27
>>426
せめてGoogleくらいは味方にしておこう。
429:デフォルトの名無しさん
08/05/07 16:00:13
プリプロセッサの問題点はC言語の一部かどうかじゃなくて
コンパイラと完全に独立しているところ
430:デフォルトの名無しさん
08/05/07 16:11:51
問題点ではないだろ
431:デフォルトの名無しさん
08/05/07 16:13:36
問題でしょ。デバッグしにくくなるし、型チェックなども甘くなるし。
432:デフォルトの名無しさん
08/05/07 19:53:41
プリプロセッサ部がCと強く結びついてるからなんだけどマクロの多用はどうかという一意見だす。
#include に変わるものは Cコンパイラに用意されてないし #ifdef のような部分も(あまり好きでないけど)うまく使うといろんな環境に対応したソースをまとめることができる・・
ただ #define で色々マクロ組むのはどうかな。
美しく無いばかりか副作用とバグを引き起こす危険な匂いすらある。置換されて結果コンパイラに渡るけど置換元がどうだったかをコンパイラは知らない・・いろんな落とし穴になる。普通に関数に書くのがいいと思う。
#define CONSTANT_VAL 50
ではな
const int CONSTANT_VAL = 50;
こう書けば char a = CONSTANT_VAL; とした時に警告があるし(アホなことした)と直ぐに気付くわけです。
433:デフォルトの名無しさん
08/05/07 20:00:28
それは別に警告出ないと思う。
マクロは使わなくていいなら使わない方がいいってのは賛成だが、
C++ に比べて C はマクロを使わざるを得ない状況が多いのは確かだな。
434:デフォルトの名無しさん
08/05/07 20:01:59
プリプロセッサディレクティブを勉強して間もない俺とするとすごい便利だと思うんだけど・・・
引数の型気にしなくてもいいマクロとか素敵じゃない?
435:デフォルトの名無しさん
08/05/07 20:03:47
マクロはどう展開されてどう実行されるのかを理解して無いと
バグを生むことがあるってのがアレなんだろうね
436:デフォルトの名無しさん
08/05/07 20:10:13
そんなとうにされつくしてる議論してんなよ・・・・・・・・
437:デフォルトの名無しさん
08/05/07 20:14:03
>>436
入門篇って書いてあるし、議論すればえ~ねん
438:デフォルトの名無しさん
08/05/07 20:16:43
>>433
私はこのレベルの警告を出すようにしてる。
>>434
そう、ただ型を気にしなくて言いというのは有る意味危険な感覚だと。
#defin abs(x) (x) < 0 ? -(x) : (x) とすれば int, long, double いずれも行けるけど
a = -3;
k = abs(a++);
結果は悲惨になるけど気付きにくいでしょ?
これは関数でなくマクロなんだと意識しなければいけない。何かスマートでないよね。
439:デフォルトの名無しさん
08/05/07 20:19:39
C++ だとそれを何とかするために関数テンプレートが導入されたが、
C だとやっぱどうしてもマクロになっちゃうんだよなあ。
440:434
08/05/07 20:24:50
>>438
マクロの怖さを頭ではなく心で理解したわ
441:デフォルトの名無しさん
08/05/07 20:26:02
ABSにすれば解決
442:デフォルトの名無しさん
08/05/07 20:52:15
馬鹿が使えば包丁も自動車も凶器になる。
443:デフォルトの名無しさん
08/05/07 21:45:43
>>435
それを言ったら無知と無理解はなんだってバグのもとだろ
444:デフォルトの名無しさん
08/05/07 21:51:07
所詮人間一人なんてちっぽけな存在さ。自分一人なんて
この世の60億分の1に過ぎない存在。万能、全知全能、
絶対権力者の人間なんて存在しない。
人間なんて脆い生き物だ。打ち所が悪ければすぐに死んでしまう。
そんなもん。だから、気ぃ張るなや、適当に生きろ。
どうせお前が強がっても、地球の運命までは変えられないから。
せいぜい、政府与党に不満を持って、反対票を民主党に入れるくらいしかぁ
出来んやろ?なっ?俺はずっと共産党に投票してたけどな。
445:デフォルトの名無しさん
08/05/07 22:09:35
マクロを使うと一見上級者のようでかっこいいんだけどね
地道に関数でということかな
446:デフォルトの名無しさん
08/05/07 22:12:57
ふっ、例えポルシェやBMWを運転していようが、軽自動車を運転していようが
同じ道路交通法が適用されている道で守るべきルールは同じさ。
それよりも、ドライバーの運転技術はいかがなものか?他に、
アクセルペダルを思いっきり踏み込めば、エンジンの性能が良い車の方が
加速性は良いが、燃費はかなり悪い。見た目じゃないぜ、人間は。
447:デフォルトの名無しさん
08/05/07 22:15:20
ええいお前のたとえは分かりにくい
448:デフォルトの名無しさん
08/05/07 22:35:14
linuxのコンソール上でカーソルの処理を行いたいのですが、
カーソルの処理には何を使ったらいいのでしょうか?
ncursesはできれば使いたくないです。
URLリンク(oshiete1.goo.ne.jp)
の方法だとカーソルキー押す度に"[b"などと出力されてしまいます。
よろしくお願いします。
449:デフォルトの名無しさん
08/05/07 23:12:49
>434
型を気にしないプログラムがどうなるのか?コンパイラが事前に警告してくれるのはありがたいと思わないと。
450:デフォルトの名無しさん
08/05/07 23:21:56
>>434
昔な、変数を宣言しなくても使えるBASICてのがあってな、綴りのミスを目で探したよ。・
昔な、プロトタイプ宣言のないCコンパイラがあってな、引数の間違いを目で探したよ。
451:デフォルトの名無しさん
08/05/07 23:23:27
FORTRANなら普通の事です
452:デフォルトの名無しさん
08/05/07 23:25:14
>>445
マクロ使っても全然上級者には見えないから安心して関数を使おう
453:デフォルトの名無しさん
08/05/07 23:28:26
可読性、保守性の高いソースを書く人のほうが上級者に見える。
まあマクロはその手段の一つなんだけれども。
454:デフォルトの名無しさん
08/05/07 23:31:13
浮動小数点の定数って定義できるんだっけ?
C++でも未だにマクロ使ってるんだけど
455:デフォルトの名無しさん
08/05/07 23:35:27
別に定数を定義することくらいはできるけど。
ただ、初期化順でハマることはあるかもしれないね。
456:デフォルトの名無しさん
08/05/07 23:37:42
voidポインタの参照先はビットシフトできないのかな?
457:デフォルトの名無しさん
08/05/07 23:40:54
>>456
void*をint*にキャストしてシフトすれば?
458:デフォルトの名無しさん
08/05/07 23:43:20
>>456
何ビット幅でシフトしたいかをコンパイラが判断できない。必要な幅の型のポインタにキャストする必要がある。
459:デフォルトの名無しさん
08/05/07 23:57:36
キャストしたらできた!
これって任意のバイト数を指定することはできないのかな?
mallocで指定しても駄目だったし無理か・・・
460:デフォルトの名無しさん
08/05/07 23:59:21
>>459
> これって任意のバイト数を指定することはできないのかな?
意味不明
461:デフォルトの名無しさん
08/05/08 00:16:42
void*の参照先を任意のビット幅としてビットシフトしたいんです
462:デフォルトの名無しさん
08/05/08 00:18:04
自分でそういうプログラム書け。
463:デフォルトの名無しさん
08/05/08 00:26:54
>>461
それ、何のデータ?
464:デフォルトの名無しさん
08/05/08 00:28:38
ビットシフトすりゃいいじゃん。
465:デフォルトの名無しさん
08/05/08 00:35:13
>>463
void*の参照先ですか?
intとかcharとか不定です
void*とsize_tを仮引数にして、型に関係なくビット表示するような関数を作りたいんですが・・・
466:デフォルトの名無しさん
08/05/08 00:38:59
とりあえずバイトオーダをはっきりしておかないとな。
リトルエンディアン環境の場合、数十バイトだろうが
その全体でリトルエンディアンになることを仮定していいのか、
それとも4バイト単位でリトルエンディアンになることを仮定するのか。
467:デフォルトの名無しさん
08/05/08 00:44:48
>>465
char*にキャストして一バイトごと表示しろよ
468:デフォルトの名無しさん
08/05/08 00:51:12
>>466
リトルエンディアンだとおもう
よくわからないから続きはwebで勉強してくるわ
>>467
おk試してみる
469:デフォルトの名無しさん
08/05/08 01:05:04
>>461
できない
ビットシフトは組み込み整数型(のビット長)に対してしか保証されていない
どうしてもやりたいなら自力でそのような関数を作るしかない
470:デフォルトの名無しさん
08/05/08 01:11:23
キャストすればいくらでもできるだろ・・・。
471:デフォルトの名無しさん
08/05/08 01:16:35
>>470
んなアホな
charに分割したとしても、左右両端からあふれたビットは結局手動で詰めざるを得ないだろ
472:デフォルトの名無しさん
08/05/08 01:20:12
もしかしてデータ圧縮なんかで使うビットごと入出力でも作ってんのかな
それだったらlhaの解説書見れば早いと思う
473:デフォルトの名無しさん
08/05/08 01:27:33
>>471
結局できるんじゃないか
474:デフォルトの名無しさん
08/05/08 01:39:36
>>473
「ビットシフト」の言葉の食い違いだったようだ
俺が考えてたのは組み込みのビットシフトのことね
そっちは概念としてのビットシフトだよな
475:デフォルトの名無しさん
08/05/08 01:41:10
> 組み込みのビットシフ
なんじゃこれは?ト
476:デフォルトの名無しさん
08/05/08 02:38:42
プロトタイプ
static void mera(const char *);
このとき
1) void mera(const char *merami)
2) void mera(const char* merazooma)
1だけのはずが
2のようなものも通ってしまうのはどうして?
どちらでも良いという意味ならば、どちらが推奨なの?
また、
static void bagi(const char ****);
このとき
1) void bagi(const char ****bagima)
2) void bagi(const char**** begiragon)
どちらも警告W8075程度で通してしまうのはどうなの?
BCC5.5.1
477:デフォルトの名無しさん
08/05/08 02:57:27
>>476
> 1) void mera(const char *merami)
> 2) void mera(const char* merazooma)
1) は C に多く、2) は C++ でみます。
どっちでも大差ないと思います。
478:デフォルトの名無しさん
08/05/08 02:59:49
スペースがあるかないかだけじゃん。何で違うものだと思うの?
479:デフォルトの名無しさん
08/05/08 03:00:44
>>477
おお、ありがとう。
480:デフォルトの名無しさん
08/05/08 03:20:48
>>476
char *p も char* p も意味は同じ
スタイルについては、変数の宣言時にたとえば
char* p, * q;
などとするのが不自然という理由で
char *p, *q;
を推奨する人は多い
481:デフォルトの名無しさん
08/05/08 03:31:59
追記
一方で char* p; を推奨する人は、変数名はあくまでpであるから
それがchar*であることを示すためにそうすると主張することが多い
ただし*はcharやint、あるいはstaticやconstのようにデータ型を修飾するものではなく
あくまで変数を修飾するものである(Cの変数宣言構文は [データ型] [変数名];
だから int const n, m; とは書けても char* p, q; とは書けない)ので、
構文的には変数名側に寄せることが正しい扱いであると言える
482:デフォルトの名無しさん
08/05/08 03:37:26
×ただし*はcharやint、あるいは
○ただし*はcharやintのようなデータ型、あるいは
483:デフォルトの名無しさん
08/05/08 04:08:15
もちろんスタイルの話だから、君はchar* pと書いてもいいし、char *pと書いてもいいし、さらにはchar * pと書いてもいいし、
また関数の仮引数リストにおいては与えられるものがおそらく配列である場合には、それを明示したいならchar str[]と書いてもいい
484:デフォルトの名無しさん
08/05/08 04:16:42
たくさんのレスありがとう、勉強になりなす。
485:デフォルトの名無しさん
08/05/08 07:37:37
>>476
×begiragon
○bagicross
なんで誰も指摘しないんだよー
486:デフォルトの名無しさん
08/05/08 13:10:17
>>448
エスケープシーケンスを正しく読めばいいんじゃないかな
確か0x1bだったっけ? この次の文字は制御文字だから、それに応じた処理をすればいい。
カーソル位なら入力されたコードをじっくり眺めればすぐに分かると思うよ
487:448
08/05/08 19:42:21
>>486
そうだったのかー!!
あれはエスケープシーケンスと制御文字が組み合わさってたん
ですね。だからあのプログラムで[Aとかが表示された訳だ。
どうもです。
488:デフォルトの名無しさん
08/05/08 19:43:21
XPでコンソールのカーソルを移動させるにはどうすればいいの?
489:デフォルトの名無しさん
08/05/08 19:46:04
スレ違い
490:デフォルトの名無しさん
08/05/08 19:46:11
>>488
URLリンク(msdn.microsoft.com)
491:デフォルトの名無しさん
08/05/08 21:34:04
mallocして帰ってきたポインタをfreeするとメモリを開放するらしいのですが、
freeにサイズを書かなくてなんでサイズがわかるんでしょうか。
#include <stdio.h>
void main()
{
char *c;
c = malloc( 10 );
if( c == NULL )return;
strcpy( c , "aiue" );
c--;//ひとつ前のポインタ(サイズは書いていないようだ)
c--;//ここにもサイズはない
c++;c++;//元に戻す
free( c );
c = NULL;
return;
}
492:デフォルトの名無しさん
08/05/08 21:38:08
>>491
管理テーブルが別にあるから
493:491
08/05/08 21:52:55
>>492
ポインタの前ではなくほかのところにあったんですね。
どうもありがとうございました。
494:デフォルトの名無しさん
08/05/08 22:04:26
どうでもいいけど、ポインタを戻すのはよろしくないんじゃね?
495:デフォルトの名無しさん
08/05/08 22:13:52
実際に確保されていることが確実な範囲(+1)を超えた演算の結果は保証されてなかった気がする
496:デフォルトの名無しさん
08/05/08 22:40:41
>>492
ちなみに確保した前の番地に文字数があるのでは?と仮定してそれを確認するなら
int* ip = (int*)c;
long* lp = (long*)c;
こうしておいて
printf("%d : ", *(ip - 1)); // c 先頭から int 分戻った場所から数値として表示
printf("%ld : ", *(lp - 1)); // c 先頭から long 分戻った場所から数値として表示
こんな風に確認するというのもあるよ(どちらにしても結果は外してるけど)
497:デフォルトの名無しさん
08/05/08 22:50:03
>>493
> ポインタの前ではなくほかのところにあったんですね。
それは処理系依存。
ポインタの前にある場合もあるだらう。
498:デフォルトの名無しさん
08/05/08 23:11:55
じゃああんま頻繁にmallocすると、逆に管理テーブルのぶんムダ使いになるんですかね??
499:デフォルトの名無しさん
08/05/08 23:13:38
管理テーブルを保持することよりも、
空きメモリを探す処理とfreeの分、
CPU時間の無駄遣いになることを気にしたほうがいい気がする。
500:デフォルトの名無しさん
08/05/08 23:22:31
ということはlinked listとかすごい効率悪いんだな・・・
ところでポインタのサイズ管理テーブルへのアクセスってどうやるの?
501:デフォルトの名無しさん
08/05/08 23:23:16
実装によるとしか
mallocのソースでも眺めてみれ
502:デフォルトの名無しさん
08/05/08 23:25:09
入門書クリアしたら次は何がいいかな?
アルゴリズム辞典とか眺めるの?
503:デフォルトの名無しさん
08/05/08 23:29:09
linked list はスタック上にメモリをプールしておけばいいぜ。
504:デフォルトの名無しさん
08/05/08 23:29:32
×スタック上
○スタック状
505:デフォルトの名無しさん
08/05/09 01:50:05
>>502
良いソースを読むことだと思う
どの言語でも同じだと思うが
506:デフォルトの名無しさん
08/05/09 01:55:07
何か作りたいものがあるから学んでいるのでは?
それを作るのにまだ足りないものがあるならそれを学べばOK
足りてるなら作ろう
507:デフォルトの名無しさん
08/05/09 13:06:55
実際に自分の目的とするものを作ること
その過程で、どのようにすれば目的を達成できるのかを考える能力を身に着けること
言語仕様がわかってても要求を実現できない新人多すぎ
コーダーじゃねぇんだからさ
508:デフォルトの名無しさん
08/05/09 17:58:14
0か1を要素にもつN次元のベクトルv(Nビットの情報ベクトルv)を入力した時
N個の要素はそれぞれ、確率pで0は1に、1は0に変わってしまい、また確率eで情報が消失する。
(消失した情報は2を代入すればよい)
上記の手続きを行い、画面にベクトルv'を出力(消失した要素はXを出力)
というプログラムを整数の配列と擬似乱数で作りたいんですが、↓では数字がおかしくなってしまいます。
環境はunixのgcc 4.0.2です、初心者ですがご指導よろしくお願いします。
なお、ここではN=5、e=0.05、p=0.1としています。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5 ;
int main(void)
{
int v[N], u[N] ;
int i ;
float e, p, x ;
for (i = 0; i <= N-1 ; i++ )
{
printf("v[%d]=",i) ; scanf("%d",&v[i]) ;
while (v[i] && v[i]!=1)
{ printf("v[%d]=",i) ; scanf("%d",&v[i]) ; }
}
509:508続き
08/05/09 17:58:40
p = 0.1 ; e =0.05 ;
for(i = 0 ; i <= N-1 ; i++)
{
srand(time(NULL));
x = (float)rand()/ 32768.0 ;
/* xは0以上1未満の乱数 */
if( x < p )
{ u[i] = (v[i]+1) % 2 ;}
/* xが0以上p未満の時、受信に誤りが生じる */
else if( x >= p && x < p+e )
{ u[i] = 2 ;}
/* xがp以上p+e未満の時、情報は消失(2を代入) */
}
printf("(") ;
for(i = 1 ; i <= 7 ; i++)
{
if (u[i] == 2)
printf("X ") ;
else
printf("%d ",u[i]) ;
}
printf(")\n") ;
return 0 ;
}
510:509訂正。失礼しました
08/05/09 18:01:25
p = 0.1 ; e =0.05 ;
for(i = 0 ; i <= N-1 ; i++)
{
srand(time(NULL));
x = (float)rand()/ 32768.0 ;
/* xは0以上1未満の乱数 */
if( x < p )
{ u[i] = (v[i]+1) % 2 ;}
/* xが0以上p未満の時、受信に誤りが生じる */
else if( x >= p && x < p+e )
{ u[i] = 2 ;}
/* xがp以上p+e未満の時、情報は消失(2を代入) */
}
printf("(") ;
for(i = 0 ; i <= N-1 ; i++)
{
if (u[i] == 2)
printf("X ") ;
else
printf("%d ",u[i]) ;
}
printf(")\n") ;
return 0 ;
}
511:デフォルトの名無しさん
08/05/09 18:31:39
>>508
srand をループで毎回実行しない。最初の1回だけで良い。
32768.0 などという数字を直に書かず、(RAND_MAX+1.0) と書く方が良い。コンパイラによって rand() の最大値は異なる。
x<p でもなく x>=p && x<p+e でもない場合、u[i] の値は?
512:508
08/05/09 18:36:04
>>511
その場合u[i]は変化しません。
擬似乱数間の扱いが違ってましたか、勉強になります
513:508
08/05/09 18:38:06
あ、変化しないんだから
u[i] = v [i] ;
ですね。なんという初歩的なミス、ありがとうございました。
514:デフォルトの名無しさん
08/05/09 18:47:04
久々に突っ込みどころ満載なコードを見た気がする
515:デフォルトの名無しさん
08/05/09 19:57:02
>>502
スレリンク(tech板)
で手伝っていただけるとありがたいのですが、いかが?
516:デフォルトの名無しさん
08/05/09 21:39:27
皆さんに伺いたいのですけど、
URLリンク(www.amazon.co.jp)
C言語の決定版と言われるこの本、どうお考えでしょうか。
あと、これのC++版ありますが、ページ数が思いっきり増えてますよね。
こちらもできたら評価をお願いできればと思います。
517:デフォルトの名無しさん
08/05/09 22:54:01
本はいらないよ ネットのほうがいい それに基礎いくらやってもWindows(UNIX)アプリは作れない。
標準Cの数倍以上の分量はこなさないと無理。標準は共通部分だけの勉強だけ
518:デフォルトの名無しさん
08/05/09 23:06:49
>>516
それ買っておきなさい。
ネットのは怪しいのが多い。
しかし洋書はたけえな。
519:デフォルトの名無しさん
08/05/09 23:09:36
>>516
お前がどうしたいのかによる、まぁその本は教養というか理解が深まるとかそういうのだ
520:デフォルトの名無しさん
08/05/09 23:43:44
>>516
スレチだけど、洋書は輸出費を考慮しても.comの方が安い場合があるぜ。
時間と多少の手間を気にしないんならこっちもチェックしておくといい。
URLリンク(www.amazon.com)
521:デフォルトの名無しさん
08/05/10 00:04:24
C言語そのものはとてもシンプルだと言うこと
#include によってもたらされる先輩方の資産と情報に振り回されない
目的をもってプログラムに取り組む
・・・
例えて、辞書を丸暗記するのか、あるいは目的を持って辞書を引くのか・・というのに通じると。
ライブラリ群の知識や使い方に重点を置くより「こうしたい関数は無いか?」とする切り口の方がいいのではないかなと。
どちらにしても有る程度は知識得ないといけない訳だけど。
522:デフォルトの名無しさん
08/05/10 00:05:42
自分見やすい(辞書)サイトを保存しておいて、AND OR NEARなどで全文検索しようぜ
523:デフォルトの名無しさん
08/05/10 00:06:11
>>516
それは初心者向けでも玄人向けでもない微妙な本なんであんまりすすめない
推薦図書スレ>スレリンク(tech板)l50
感想スレ>スレリンク(tech板)l50
524:デフォルトの名無しさん
08/05/10 00:10:00
たとえば、空き実メモリの容量を知りたければ、 メモリ 容量 などで検索する。
525:デフォルトの名無しさん
08/05/10 00:14:21
シンプルに見えて実はぐちゃぐちゃ それがC
526:デフォルトの名無しさん
08/05/10 00:16:21
Cをちゃんと理解したかったら、コンパイルした先のアセンブラと対比させるのが一番だと思う。
それが可能なのがCの最大の利点であり最大の欠点だから。
527:デフォルトの名無しさん
08/05/10 00:20:16
まず独習かダイテルあたりのしっかりした入門書で基礎仕様の理解を押さえる
その上でひたすら「目的意識を持って」コードを書きつつCFAQを流し読めば十分
528:516
08/05/10 08:23:53
レス色々ありがとう。
自分はプログラミングはちょっとやったことありますが、C言語に
ついてはさっぱりです。プログラミング言語Cがあれば何もいらない、
って話を聞いたんですけど、ちょっと古い本だしどうなんだろうなぁと。
だけど、薄い本なんで、これでC言語が概観できるというなら欲しいと
思ってます。
>>523
こういうスレがあったんですね。ありがとうございます。
529:デフォルトの名無しさん
08/05/10 11:02:19
ただの趣味だからって、効率悪くてもなるべく自作するようにしてる俺エドモンド本田
530:デフォルトの名無しさん
08/05/10 16:04:28
複数行文字列(100行以上)を標準出力に書き出す際、
\ で複数行まとめて書くとインデントが使えず見辛い。
別の方法を考えたところ
1) printfで一行ずつ
printf("黒い0服\n");
printf("お茶を1杯\n");
2) fputsで一行ずつ
fputs("赤い2んじん\n", stdout);
fputs("橙色の3かん\n", stdout);
3) 配列に格納してwhile puts
char *memo[] = {
"黄色い4んごう",
"五月みどり",
""
};
char **memop = memo;
while(**memop)
puts(*memop++);
(1) や (2) は解かりやすいが、(3) の方が見やすい。
ただ (3) のままだと宣言初期化時しか格納できない。
・分岐後に文字列を格納したい。
・strcpy は使用を控えたい。
悔しいのでスマートな書き方教えてくれ。
531:デフォルトの名無しさん
08/05/10 16:07:53
printf("黒い0服\n"
"お茶を1杯\n");
でいいよ
532:デフォルトの名無しさん
08/05/10 16:08:31
別のテキストファイルにして読み込む
マジおすすめ
533:デフォルトの名無しさん
08/05/10 16:09:19
あぁでもprintfに直接文字列は推奨されないよ
%入ってるとまずいからだけど
534:デフォルトの名無しさん
08/05/10 16:12:28
putsでいいだろ
535:デフォルトの名無しさん
08/05/10 16:26:36
そこでfputsですよ
536:デフォルトの名無しさん
08/05/10 16:37:01
ABC &
上記の様にバックグラウンドプロセスABC に、パラメータを与えて実行させるのは
どの様にすればいいのですか?
537:デフォルトの名無しさん
08/05/10 16:43:21
それはシェルの役目
538:デフォルトの名無しさん
08/05/10 16:45:35
>>531
あぁ , 無しで繋げられるのだっけか。
でも , をつけてしまいやすいので使い方だけ覚えとく。
>>532,533
メモっとく。
>>534
puts("青6し");
puts("むらさき7ぶ");
か
puts(
"むらさき7ぶ\n"
"灰ヤー"
);
のような感じか。
もう少し考えてみるわ、サンクス。
539:デフォルトの名無しさん
08/05/10 16:50:35
本題より例文が気になって仕方がない。むらさきしちぶ?
540:デフォルトの名無しさん
08/05/10 16:54:17
抵抗のカラーコードの語呂合わせだろ。
俺は「青二才のろくでなし」って覚えているんだけど。
541:デフォルトの名無しさん
08/05/10 18:44:45
失礼しms。
URLリンク(www.uploda.org)
上記のようなコードを書いたのですが、
bの領域を解放するときに
”Windows によって aaaaa.exe でブレークポイントが発生しました。ヒープが壊れていることが原因として考えられます。aaaaa.exe または読み込まれた DLL にバグがあります。”
のようなエラーが出てしまいます・・・。。。
確保していない領域にアクセスし、それをフリーしようとしたときにおこるエラーみたいなことがググったら書いてあったのですが、
double** b; が確保されている領域と、callocで追加確保された領域が連続でないということでしょうか?
またそのせいでこのエラーがおこっているのでしょうか?
ご教授願います。よろしくお願いします。。。
542:デフォルトの名無しさん
08/05/10 18:50:19
>>541
> memmove(b, a, sizeof(a[0])*sizeof(a[0][0]));
これのせいで同じ領域を二回 free している
543:541
08/05/10 20:38:45
>>542
memmoveだとだめなのでしょうか?
544:デフォルトの名無しさん
08/05/10 20:42:06
>>543
何がやりたいかによる
a[y][x] に格納されている double の値をコピーしたいのであれば
for(y=0;y<N;y++) memmove(b[y], a[y], N*sizeof(a[0][0]));
545:541
08/05/10 20:45:19
やりたいことはその通りなのですが、今の状態だとポインタをコピーしてる状態ということでしょうか?
546:デフォルトの名無しさん
08/05/10 20:47:01
>>545
V / / _,, ァ=ニニ:} _
.V /,.ィ"f= <r'ニ三{ |_ ┐ _l_ l
'vf^<''" 弋z.ミ'テtフ |_ Х □_ 匚 L | У
〉!ト _ i{ ´ ̄r' =|'
./ェ゙‐ェi. 、__`_ヤ ( その通りでございます )
./iュ.Hヽ.、 ゙,ニ/
-^ ー'-.、,i._`ヽ,.仁リ
ー - .、 /、
547:デフォルトの名無しさん
08/05/10 20:50:49
>>542,544,546
なるほどです。つながりました。ありがとうございました><
548:デフォルトの名無しさん
08/05/11 01:50:19
初心者です。すみませんがアドバイスお願いします。
char (*pacX)[3];
とした場合、pacXは3要素のchar配列へのポインタになると思いますが、
このような変数「の配列」を以下のように動的に確保するとします。
int iNum = 2;
char (*pacX)[3] = new (char)[iNum][3];
この場合、ポインタ変数が2つ(iNum分)確保されるのでしょうか。それとも、それらが指す3要素のchar配列2つ分のメモリまで確保されるのでしょうか?
549:デフォルトの名無しさん
08/05/11 01:52:50
typedef して考えてみよう。
typedef char CharArray3[3];
CharArray3* pacX = new CharArray3[iNum];
550:デフォルトの名無しさん
08/05/11 01:56:23
newてC++やん
551:デフォルトの名無しさん
08/05/11 02:13:33
>newてC++やん
すみません、確かにそうですね。
>>549
なるほど。。。元の質問で言えば後者の「それらが指す3要素のchar配列2つ分のメモリまで確保される」ということなのですね?
イメージ的には 「char aacX[2][3]」と同じ分のメモリが確保されて、さらにいえば
delete [] pacX;
とすることで開放されるということよろしいでしょうか?
で
552:デフォルトの名無しさん
08/05/11 02:24:13
>>551
そういうこと。
553:デフォルトの名無しさん
08/05/11 02:28:42
>>552
ありがとうございました。
554:デフォルトの名無しさん
08/05/11 04:05:19
>>548
その記述ちょっと気色悪い。一歩間違うと関数へのポインターと見間違えちゃうし。
int (*func)(int k); // 関数へのポインター
int a1(int k) { printf("%d¥n", k * 5); return k; }
int a2(int k) { printf("%d¥n", k / 5); return k; }
int main()
{
func = &a1;
func(k);
func = &a2;
func(k);
}
みたいな・・・
普通に char *a[3]; でいいと思うけど。
555:デフォルトの名無しさん
08/05/11 04:06:45
>>554
内容が理解できない人は黙っておいた方がいいよ。
556:デフォルトの名無しさん
08/05/11 06:00:32
char *a[3] ポインタの配列
char (*a)[3] 配列のポインタ
557:デフォルトの名無しさん
08/05/11 10:22:40
CGIにC使ってる人ってあまり見かけないんだけど、CでCGIってダメダメなの?
558:デフォルトの名無しさん
08/05/11 10:33:06
実行速度的には悪くないけど、LLに比べるとテキスト処理が面倒なのと、非セキュアになりやすい(バッファオーバーフローとか)からじゃないかねぇ。
559:デフォルトの名無しさん
08/05/11 10:40:20
単にcコンパイラ使わせてくれる鯖が少ないからじゃないの?
560:デフォルトの名無しさん
08/05/11 10:43:33
>>559
どの言語が用意されているかというのは、Web制作板的な視点じゃないか
プログラム板的には、どの言語で実装するのが適切かという話題だと思ってたが。
561:デフォルトの名無しさん
08/05/11 10:47:22
>あまり見かけないんだけど
とあったからそれに沿うように答えただけなのだが。
性能的には何ら問題ないと思う、とつけたほうがよかったかな?
562:デフォルトの名無しさん
08/05/11 11:06:01
なぜCコンパイラ使わせてくれる鯖が少ないか、
というところまで考え出すと、
結局 >>558 に行き着くんじゃないかと思う。
563:デフォルトの名無しさん
08/05/11 11:41:06
数列の最大値を計算するアルゴリズム 数列:0、3、1、4、7、2、8
お願いします。
564:デフォルトの名無しさん
08/05/11 11:45:28
>>563
わかりました
消えてください
565:デフォルトの名無しさん
08/05/11 11:48:20
宿題丸投げは宿題スレへ
566:デフォルトの名無しさん
08/05/11 12:00:34
><
567:デフォルトの名無しさん
08/05/11 12:22:18
>>563
max(0, max(3, max(1, max(4, max(7, max(2, max(8)))))));
><
568:デフォルトの名無しさん
08/05/11 14:42:42
適当に数字を入力して
その数字をまたある数で割って割り切れたらその値を出力して
割り切れなかったら余りだけをまた別の小さい値で割りきれるか
って繰り返して最終的には割り切れるプログラムを作りたいんですが・・・
例えば1020を500で割ると2余り20で2が出力され
余り20を10で割って2が出力されるみたいな
ヒントでもいいんでお願いしますm(_ _)m
569:デフォルトの名無しさん
08/05/11 15:23:44
その日本語を1行ずつCに翻訳していけばいいと思うよ
570:デフォルトの名無しさん
08/05/11 15:24:56
ってある数で割るって何で割るんだよ
1020を1020で割って余り0で終了、じゃだめなの
571:デフォルトの名無しさん
08/05/11 15:25:52
意味が分からん
ある数って何だよ
入力した値か?
572:デフォルトの名無しさん
08/05/11 15:28:12
>>558
速度的にはアレなんじゃね?
スクリプト系のmod_*みたいな仕組みってCでは一般的でないし。
2chは、やってるみたいだけど。
573:デフォルトの名無しさん
08/05/11 16:10:07
>>568
ユークリッドの互除法?
574:デフォルトの名無しさん
08/05/11 16:12:50
568です
説明が下手ですいません
レジのおつりを渡す要領で
適当な値を入力して500、100、10、1で各々割って何が何枚必要か求めたいんです
575:デフォルトの名無しさん
08/05/11 16:14:36
どこが分からないのかわからない。
それをそのままコードに落とせばいいだけだろ
576:デフォルトの名無しさん
08/05/11 16:19:33
つりの硬貨の枚数が最小になるようにとか、なにがしかの条件がついてるけど、それが説明できてないんだろ?
577:デフォルトの名無しさん
08/05/11 16:19:49
こうだろ
#include<stdio.h>
int main() {
static const int coin[] = {500,100,50,10,5,1,0};
int price, i;
printf("金額は?");
scanf("%d", &price);
for(i = 0; coin[i]; i ++) {
printf("%d円玉が%d枚\n", coin[i], price / coin[i]);
price %= coin[i];
}
}
578:デフォルトの名無しさん
08/05/11 16:19:57
ちょっと自分でやってみます
迷惑かけてすいませんでした
579:デフォルトの名無しさん
08/05/11 16:20:39
自己解決しました
580:デフォルトの名無しさん
08/05/11 16:31:40
エロイ人教えてください!
エクセルで作成したファイルをスターファックスで
VBAなどで自動送信出来ませんか?
キーボードマクロなるフリーソフトを見つけましたが
自分ではうまく設定できません
イメージは以下の感じです
①送信ファイルをエクセルで作成
②VBAでスターファックスを起動
③キーボードマクロ等で送信先を自動入力
④エクセル画面に戻る
初心者丸出しですいませんが宜しくお願いします
581:デフォルトの名無しさん
08/05/11 16:31:49
どうでもいいが、とってもありがちな課題だな。
582:デフォルトの名無しさん
08/05/11 16:58:37
>>580
こんなソフト作ってくださいスレに行きやがれですぅ
583:580
08/05/11 18:05:44
>>582
そんなスレあるんですか?
移動します スンマセン
584:デフォルトの名無しさん
08/05/11 18:17:49
ある下記のような2つのcsvファイルの「商品コード」という項目を比較して
実績ファイルにある「商品コード」が、商品コードマスタに存在するかどうか
をチェックし、あったらその後の処理へ、なかったらエラーを出すといったプログラムを作りたいと考えてます。
(売上ファイル.csv)
顧客コード,商品コード,数量
10000,2544,2
12111,2566,5
12546,2354,8
(商品コードマスタ.csv)
商品コード,商品名,単価
2544,aaaaa,1000
2354,bbbbb,1500
このとき、c言語ではどういった関数を使って
どういった流れで考えるとよいでしょうか?
例えば下名はアクセスを使ったことあるので
アクセス(VB)でのテーブル同士の比較だったら、
if 商品コード(売上ファイルTBL)=商品コード (商品コードマスタTBL)
をレコードのEOFまで繰り返す、という処理でいいと思うのですが、
c言語の場合、しかもカンマ区切りcsvファイルの処理の場合、
どういった方向で考えたらいいのかということを知りたいです。
参考書を見たところ、ファイルポインタをつかう、fopen関数をつかうfgets関数で1行読み込む
といった機能を使うのかなと思いましたが、商品コード部分のみを取り出して比較するやりかたがわかりません。
(また、全てのデータの桁数は変わる可能性があります)
あつかましいですが、よろしければサンプルコードも提示して
いただけたらありがたいです。
585:側近中の側近 ◆0351148456
08/05/11 18:28:17
>>584
(っ´▽`)っ
char shohinCode[256];
char shohinName[256];
int tanka;
fscanf(fp, "%s,%s,%s", shohinCode, shohinName, &tanka);
586:側近中の側近 ◆0351148456
08/05/11 19:25:26
>>584
(っ´▽`)っ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *elem1, const void *elem2);
int existInMaster(void);
typedef struct shohinM{
char shohinCode[256];
char shohinName[256];
int tanka;
} shohinMaster;
int main(void)
{
int line;
line = existInMaster();
if(line == 0){
printf("エラーはありません\n");
}
else{
printf("%d行目にエラーがあります\n", line);
}
return 0;
}
(続く)
587:側近中の側近 ◆0351148456
08/05/11 19:26:07
>>586の続き
int existInMaster(void)
{
int returnCode = -1;
FILE *fp = NULL;
char line[1024];
int lineCount = 0;
shohinMaster *sm = NULL;
char shohinCode[256];
char kokyakuCode[256];
int suryo;
int count = 0;
int i;
fp = fopen("./商品コードマスタ.csv", "r");
fgets(line, sizeof(line), fp); /*1行目は見出し*/
while(fgets(line, sizeof(line), fp) != NULL){
sm = (shohinMaster *)realloc(sm, sizeof(sm[0]) * (count + 1));
sscanf(line, "%[^,],%[^,],%d", sm[count].shohinCode, sm[count].shohinName, &(sm[count].tanka));
count++;
}
fclose(fp);
qsort(sm, count, sizeof(sm[0]), cmp);
(続く)
588:側近中の側近 ◆0351148456
08/05/11 19:26:48
>>587の続き
fp = fopen("./売上ファイル.csv", "r");
fgets(line, sizeof(line), fp); /*1行目は見出し*/
while(fgets(line, sizeof(line), fp) != NULL){
lineCount++;
sscanf(line, "%[^,],%[^,],%d", kokyakuCode, shohinCode, &suryo);
for(i = 0; i < count; i++){
if(strcmp(sm[i].shohinCode, shohinCode) == 0){
break;
}
if(strcmp(sm[i].shohinCode, shohinCode) > 0){
returnCode = lineCount;
goto END;
}
}
if(i == count){
returnCode = lineCount;
goto END;
}
}
END:
return returnCode;
}
int cmp(const void *elem1, const void *elem2){
return strcmp(((shohinMaster *)elem1)->shohinCode, ((shohinMaster *)elem2)->shohinCode);
}
589:側近中の側近 ◆0351148456
08/05/11 19:35:31
(っ´▽`)っ
さあ感謝しなさい☆
(っ´▽`)っの足を舐めなさい☆
590:デフォルトの名無しさん
08/05/11 20:03:04
変なコテだけど、いいやつだな。
591:デフォルトの名無しさん
08/05/11 20:16:41
無意味にコテつけてる時点で・・・
592:側近中の側近 ◆0351148456
08/05/11 20:46:21
(っ´▽`)っ
>>586-589には
リソース解放漏れがたくさんあるから注意してね☆
関数existInMasterのEND:の直後に
fclose(fp);
if(sm != NULL){
free(sm);
}
を加えるんだ☆
593:側近中の側近 ◆0351148456
08/05/11 20:48:10
>>591
(っ´▽`)っ
無意味にコテ!?
(っ´▽`)っはコテつけるのが当たり前なの!
URLリンク(www.google.co.jp)
594:584
08/05/11 21:03:04
ご親切にありがとうございます。
ちなみにこのままコピペしてとりあえず実行してみようと思ったら
100個を超えるエラーが出たのですが、そのままではいけないのですかね?
とりあえず、解読動くかどうかより
解読して、流れを理解することをがんばります
595:側近中の側近 ◆0351148456
08/05/11 21:05:25
>>594
(っ´▽`)っ
インデントに全角スペース使ってるからね。
半角スペース、タブ文字は、2chでは表示されないの。
コピーしたら全角スペースを全て半角スペースに置換してね。
596:584
08/05/11 21:13:39
>>595
了解しました。
なにからなにまでありがとうございます。
597:584
08/05/11 21:24:18
>>595
すみません、もうひとつ。
今解読中なのですが、理解の手助けに
・処理の流れ
・このプログラムの入力と、出力値
など、簡単に教えていただけませんか?
本当の初心者ですみません。
598:デフォルトの名無しさん
08/05/11 21:26:57
HTMLの使用も理解できない馬鹿がいる。
599:デフォルトの名無しさん
08/05/11 21:31:20
>>598
それを言うならHTMLの仕様だろ、と。
まぁ、変数宣言の変数名を揃えようとする辺りでお察しだから。
600:デフォルトの名無しさん
08/05/11 21:34:46
灯台や鏡台の先生からは sed の使い方とかは習わなかったんでしょうかね?
601:デフォルトの名無しさん
08/05/11 21:50:09
>>597
自分がどういうプログラム要求したか覚えてる・・?
見ていくと何となく流れがつかめるでしょ
どこまで理解したか言わないと答え丸写しで理解した気になる子になるよ
初心者≠免罪符
602:側近中の側近 ◆0351148456
08/05/11 22:39:49
(っ´▽`)っ
/*
*戻り値:
*エラーなし:0
*エラーあり:エラーがある行番号(見出し行を除く)
*/
int existInMaster(void)
{
int returnCode = -1; /*戻り値*/
FILE *fp = NULL; /*ファイルポインタ*/
char line[1024]; /*ファイル読み込みバッファ*/
int lineCount = 0; /*行番号*/
shohinMaster *sm = NULL; /*商品マスタ配列*/
/*以下、売上ファイルレコード格納用変数*/
char shohinCode[256]; /*商品コード*/
char kokyakuCode[256]; /*顧客コード*/
int suryo; /*数量*/
int count = 0; /*商品マスタ配列サイズ*/
int i; /*ループカウンタ*/
/*商品コードマスタを全て読み込み、商品マスタ配列に格納する*/
fp = fopen("./商品コードマスタ.csv", "r");
fgets(line, sizeof(line), fp); /*1行目は見出し*/
while(fgets(line, sizeof(line), fp) != NULL){
sm = (shohinMaster *)realloc(sm, sizeof(sm[0]) * (count + 1));
sscanf(line, "%[^,],%[^,],%d", sm[count].shohinCode, sm[count].shohinName, &(sm[count].tanka));
count++;
}
fclose(fp);
603:側近中の側近 ◆0351148456
08/05/11 22:40:30
/*商品マスタ配列を商品コードの昇順に並べる*/
qsort(sm, count, sizeof(sm[0]), cmp);
/*売上ファイルを1行ずつ読み込み、商品コードを商品マスタ配列と照合する*/
fp = fopen("./売上ファイル.csv", "r");
fgets(line, sizeof(line), fp); /*1行目は見出し*/
while(fgets(line, sizeof(line), fp) != NULL){
lineCount++;
sscanf(line, "%[^,],%[^,],%d", kokyakuCode, shohinCode, &suryo);
for(i = 0; i < count; i++){
if(strcmp(sm[i].shohinCode, shohinCode) == 0){
break;
}
/*商品マスタ配列は商品コードの昇順に並べている*/
if(strcmp(sm[i].shohinCode, shohinCode) > 0){
returnCode = lineCount;
goto END;
}
}
/*商品マスタ配列にない場合、行番号を返す*/
if(i == count){
returnCode = lineCount;
goto END;
}
}
END:
return returnCode;
}
/*商品マスタ配列を並べる時、商品コードの昇順に並ぶようにする*/
int cmp(const void *elem1, const void *elem2){
return strcmp(((shohinMaster *)elem1)->shohinCode, ((shohinMaster *)elem2)->shohinCode);
}
604:側近中の側近 ◆0351148456
08/05/11 22:44:43
>>597
(っ´▽`)っ>>602-603
これで満足か?
605:側近中の側近 ◆0351148456
08/05/11 22:52:56
(っ´▽`)っ
売上ファイルも商品コードの昇順に並べると
もっといい感じになるかもね。
606:デフォルトの名無しさん
08/05/11 23:32:17
次の様に、単語毎に空白で区切られた文字列があり、一単語ずつ取ってくる処理を
行いたいと考えてます。文字列の中に入っている単語数は不定とします。
char str_str[] = "str1 str2 ・・・・ strN";
今現在、次に書き込むソースの様な処理で、一つずつ単語を読み込んでいます。
ここで、質問なのですが、sscanf等を使用してもっと上手に処理することはできないでしょうか?
以下の様にダミー変数を利用する方法は考えたのですが、入っている単語数が不定
なため、どうも不恰好なソースになってしまいます。
sscanf(str_str,"%s %s %s %s %s",str1, str2, str3, dummy, dummy);
すいませんが、アドバイスよろしくお願いします。
607:606
08/05/11 23:33:02
現在使っているソースコードは以下になります。
int main(void)
{
char src_str[]="str1 str2 str3 str4 str5";
char *next;
char *buff=src_str;
while((next=strsplit(buff, " "))!=NULL){
// 空白文字が2個以上続いた場合はbuffにはナル文字が入っている
if(buff[0] != '\0')
fprintf(stderr, "buff=%s, next=%s\n",buff, next);
buff=next;
}
return 0;
}
// 文字列をdelimstrを区切り文字列として分割し、区切後の文字列へのポインタを返す
char *strsplit(char* str,const char* delim_str)
{
char* delim_point = strstr(str,delim_str);
const size_t delim_len = strlen(delim_str);
size_t i;
if(delim_point == NULL) return NULL;
else {
*delim_point = '\0';
for(i=0;i<delim_len;i++) delim_point++;
}
return delim_point;
}
608:606
08/05/11 23:35:17
すいません、書き込んだ後、インデントがされてないのに気がついつきました。同じソースですが
int main(void)
{
char src_str[]="str1 str2 str3 str4 str5";
char *next;
char *buff=src_str;
while((next=strsplit(buff, " "))!=NULL){
// 空白文字が2個以上続いた場合はbuffにはナル文字が入っている
if(buff[0] != '\0')
fprintf(stderr, "buff=%s, next=%s\n",buff, next);
buff=next;
}
return 0;
}
// 文字列をdelimstrを区切り文字列として分割し、区切後の文字列へのポインタを返す
char *strsplit(char* str,const char* delim_str)
{
char* delim_point = strstr(str,delim_str);
const size_t delim_len = strlen(delim_str);
size_t i;
if(delim_point == NULL) return NULL;
else {
*delim_point = '\0';
for(i=0;i<delim_len;i++) delim_point++;
}
return delim_point;
}
609:デフォルトの名無しさん
08/05/11 23:38:06
なんというstrtok
610:デフォルトの名無しさん
08/05/11 23:38:19
>>608
sscanf(str, "%s%n", ...)
611:606
08/05/11 23:40:42
実際に処理をしている部分は冗長になってしまうため、以下のコードが
入っている部分で、処理を実施していると考えてください。
fprintf(stderr, "buff=%s, next=%s\n",buff, next);
また、src_strの内容が変わってしまう点は仕様として、その様にしてます。
よろしくお願いします。
612:606
08/05/11 23:59:40
>609
確かに、この処理内容だと、strtokで十分ですね・・・。文字列群で区切るstrでは
不便な事が多く、strsplitという文字列パターンで区切る関数を作成しており、何も考えず
そのまま使用していました。ご指摘ありがとうございます。
>610
すいません、その処理はダミー変数を利用する方法とは異なる方法なのでしょうか?
つまり、下記の様な処理とは別の処理ということなのでしょうか?
sscanf(str_str,"%s %s %s %s %s",str1, str2, str3, dummy, dummy);
613:デフォルトの名無しさん
08/05/12 00:39:57
rand関数は合同乗算法ですか?
614:デフォルトの名無しさん
08/05/12 00:42:50
仕様上特に決まってない。
最近は lagged Fibonacci なこともあるようだ。
615:デフォルトの名無しさん
08/05/12 00:45:03
>>613
どういう方法でなければならないという規定はない。
現実には線形合同法がよく使われている。
616:デフォルトの名無しさん
08/05/12 00:48:45
>>613
大概そうですよ
617:デフォルトの名無しさん
08/05/12 00:50:38
>>614-615
レスありがとうございます。
c言語で書くと
a[i+1]=a[i]*j%10*10*10*10
で良いのですか?(a[i+1]=j*a[i] (mod10^4))
618:デフォルトの名無しさん
08/05/12 00:54:19
数学板から飛んできたか
a[i+1]=a[i]*j%(10*10*10*10)
というか
a[i+1]=a[i]*j%10000
でいいんじゃないのか
619:デフォルトの名無しさん
08/05/12 00:55:54
すみません質問を変えます。
0から1の範囲の乱数を合同乗算法で書くにはどのように書けばいいですか?
>>618 ばれたか・・・正直kingはウザイと思っています。
620:デフォルトの名無しさん
08/05/12 00:58:13
数学板でも思ったんだが、前の質問に答えてもらってるのに、
それに何の反応もせずに「質問を変えます」はないだろ。社会常識的な意味で。
621:デフォルトの名無しさん
08/05/12 00:59:29
>>620
すみません・・・
622:デフォルトの名無しさん
08/05/12 01:00:11
整数の 0~(n-1) の乱数を発生させて
double にキャストして n で割ればいいんじゃない
623:デフォルトの名無しさん
08/05/12 01:02:03
>>622
レスありがとうございます
a=rand()/(RAND_MAX+1.0);
としてもいいのですが>>618さんの方法で書くことはできませんか?
624:デフォルトの名無しさん
08/05/12 01:04:35
a[i+1]=a[i]*j%10000;
b[i+1]=a[i+1]/(10000.0);
625:デフォルトの名無しさん
08/05/12 01:32:58
>>624 ありがとうございます
一応書いてみたのですがエラーが出てしまいます
どこがおかしいですか?ちなみに円周率を求めるプログラムです
#include <stdio.h>
int main(void)
{
double i,max;
double x,y,pi;
int a[1000],j;
double b;
double c=0,d=0;
max=100;
a[0]=9454;
j=9456;
for(i=0;i<=max;i++) {
a[i+1]=a[i]*j%10000;/*ここでエラーが出ます。*/
b[i+1]=a[i+1]/(10000.0);
if((b[i+1]*b[i+1]+b[i]*b[i])<=1.0) {
c+=1.0;
}
else{
d+=1;
}
}
pi=4*c/(c+d);
printf("%f\n",pi);
return 0;
}
626:デフォルトの名無しさん
08/05/12 01:36:24
数字を渡したら曜日を表示する関数を作ったのですが、関数内に
char youbi[7][] = {"日曜日", "月曜日",....}
と書きました。
これだと関数が呼ばれるたびに変数を作って文字列を入れてることになりますよね?
頻繁に呼ぶ関数にこういうことすると速度などに悪い影響ありますか?
627:デフォルトの名無しさん
08/05/12 01:36:32
double i
628:626
08/05/12 01:37:21
すみません訂正します。
char youbi[][7] です。
629:デフォルトの名無しさん
08/05/12 01:38:28
>625
iをintで宣言すること。
>626
ある場合もあるし、無い場合もあるが、大抵の場合気にするほどの差ではない。
630:デフォルトの名無しさん
08/05/12 01:38:30
&はアンパサンドだけど
|はなんていうんだっけ?
なかなか検索ひっかからないんだよね
631:デフォルトの名無しさん
08/05/12 01:39:40
>>627
そうですね・・・すみません
でも、 配列または、ポインタでない変数に添字が使われました。とエラーがでます・・・
どこを直せばよいですか?
632:デフォルトの名無しさん
08/05/12 01:39:53
パイプ
633:626
08/05/12 01:41:06
>>629
ありがとうございます
気にしないことにします
634:デフォルトの名無しさん
08/05/12 01:41:24
>>631
そこまでエラーメッセージ読んでてわからないほうがどうかしてる
635:デフォルトの名無しさん
08/05/12 01:42:22
>>631
それくらいコンパイラが懇切丁寧に教えてくれてるだろうに無視すんなよ
頼むからエラーをこぴぺしてくれ
636:デフォルトの名無しさん
08/05/12 01:42:39
>631
配列でもポインタでもないものに添え字が使われたから。あとは行番号を見ること。
念のために言っておくが添え字とは[?]の部分のこと。