entweder ist die php Version zu alt, zu neu oder die benötigte php Version ist nicht auf dem Server korrekt konfiguriert...

erstelle eine Datei namens info.php mit folgendem Inhalt;

<?php
phpinfo();
?>

und rufe die Datei über den browser ab, also www - Domain - info.php

dort siehst du alle php infos

...zur Antwort

Du kannst zum Beispiel die AWS-SDK oder Lambda in Node.js benutzen, um mit Alexa-Geräten zu kommunizieren. Über die AWS-Konsole erstellst du ein IoT-Thing und verknüpfst es mit deinem Alexa Smart Home Skill.

In deinem Node.js-Skript nutzt du dann die AWS-SDK, um deine Alexa-Steckdose auszuschalten. Danach kannst du mit Node.js den Befehl zum Herunterfahren deines Laptops ausführen

hier zum beispiel ein github projekt;

https://github.com/alexa-js/alexa-app

willst du nur mit js arbeiten ?

in python oder c# geht dass nämlich noch einfacher.

Gruß EchoTech

...zur Antwort
Was machen diese Powershellbefehle?

Ich habe follgendes Script mit folgenden Kommentaren:
# Nach dem Quellordner fragen

$sourceFolder = Read-Host "Quellordner"

# Nach dem Zielordner fragen

$targetFolder = Read-Host "Zielordner"

$SearchFile = 'ManualToHelpCmd.exe' # Datei welche gesucht werden soll

$ExcludeFolders = 'Windows','Video' # Hauptordner in Laufwerken, welche überhaupt nicht durchsucht werden sollen

# ermittle alle lokalen Laufwerke (HDD, SSD, USB, SD...) (keine CD, DVD)

$Drives = (Get-CimInstance -ClassName Win32_LogicalDisk -Filter 'DriveType = 3 or DriveType = 2').DeviceID -as [Array] 

# Get-CimInstance:Instanzen einer bestimmten Klasse aus dem CIM (Common Information Model) abruft

# ClassName Win32_LogicalDisk: Gibt an, dass Informationen aus der Klasse Win32_LogicalDisk abgerufen werden sollen die Laufwerke auf dem System beschreibt

# Filter 'DriveType = 3 or DriveType = 2': Ein Filter der nur die logischen Laufwerke auswählt deren DriveType gleich 3 oder 2 ist. DriveType 3 steht für lokale Festplatten, und DriveType 2 steht für Wechseldatenträger (z.B. USB-Sticks).

# DeviceID: Greift auf die DeviceID-Eigenschaft der zurückgegebenen logischen Laufwerke zu, was die Laufwerksbuchstaben (z.B. C:, D:) darstellt

# -as [Array]: Konvertiert die Liste der DeviceIDs in ein Array

# Überprüfen, ob Laufwerke gefunden wurden

if (-not $Drives) {

  Write-Host "Keine Laufwerke gefunden." -ForegroundColor Red

  exit

}

# das eigentliche Arbeitspferd

$Worker = {

  param(

    [Array]$Drives,

    [String]$Filter,

    [Array]$ExcludeFolders

  )

# param(: Definiere die Parameter die der Skriptblock akzeptiert

# [Array]$Drives: Ein Array von Laufwerken

# [String]$Filter: Ein String-Filter

# [Array]$ExcludeFolders: Ein Array von auszuschließenden Ordnern

  $Results = @() #Initialisiert eine leere Array-Variable namens "Results" die verwendet wird um die Ergebnisse zu speichern.

  foreach ($Drive in $Drives) { #Jedes Element wird in der Variablen $Drive gespeichert.

    $Results += (Get-ChildItem "$Drive\" -File -Filter $Filter -ErrorAction SilentlyContinue).FullName #-ErrorAction: Dieser Parameter steuert, wie das Cmdlet auf Fehler reagiert. SilentlyContinue: Diese Einstellung bewirkt, dass Fehler zwar erkannt, aber nicht angezeigt werden. Filtert hier sozusagen anch den Fehlern aber gibt sie nicht aus

    $Results += (Get-ChildItem "$Drive\" -Directory | Where-Object Name -notin $ExcludeFolders | Get-ChildItem -File -Filter $Filter -Recurse -ErrorAction SilentlyContinue).FullName #-Directory = nur buchstaben, | = und, Recurse = sucht in 

   

     

  }

  return $Results

}

# die Suche starten...

if ($Drives.Length -lt 2) {

  # wenn wir nur ein (Physikalisches) Laufwerk haben können wir die Verteilung auf mehrere Jobs sparen, einfach den Worker direkt ausführen

  Write-Host "$($Drives.Length) physikalische Festplatte(n), Suche wird einstufig durchgeführt:" -ForegroundColor Magenta

  $Result = & $Worker -Drives $Drives -Filter $SearchFile -ExcludeFolders $ExcludeFolders

} else {

  # bei mehreren Laufwerken die Arbeit auf mehrere parallele Jobs verteilen

  $Jobs = $Drives | ForEach-Object {

    Write-Host "Festplatte $_ wird durchsucht" -ForegroundColor Green

    Start-Job -ScriptBlock $Worker -ArgumentList @($_ , $SearchFile, $ExcludeFolders)

  }

  $Result = $Jobs | Wait-Job | Receive-Job | Where-Object {$_}

}

# Debugging-Ausgabe für die gefundenen Ergebnisse

Write-Host "Gefundene Dateien:" -ForegroundColor Cyan

$Result | ForEach-Object { Write-Host $_ -ForegroundColor Cyan }

if ($Result) {

  # Wenn mehrere Dateien gefunden werden, Auswahl anzeigen

  if ($Result.Count -gt 1) {

    Write-Host "Es wurden mehrere Dateien gefunden mit gleichnamigen Namen. Wählen Sie die gewünschte Datei aus!" -ForegroundColor Yellow

    $selectedFile = $Result | Out-GridView -Title "Wählen Sie die Datei aus, welche Sie benutzen wollen!" -OutputMode Single

  } else {

    $selectedFile = $Result

  }

  # Das Ergebnis (können auch mehrere Dateien gleichen Namens sein)

  if ($selectedFile) {

    Write-Host "Ausgewählte Datei: $selectedFile" -ForegroundColor Green

    & $selectedFile $sourceFolder $targetFolder

  } else {

    Write-Host "Keine Datei ausgewählt" -ForegroundColor Red

  }

} else {

  Write-Host "Keine Datei gefunden" -ForegroundColor Red

}

Aber was machen diese zwei Zeilen?:
$Results += (Get-ChildItem "$Drive\" -File -Filter $Filter -ErrorAction SilentlyContinue).FullName 

$Results += (Get-ChildItem "$Drive\" -Directory | Where-Object Name -notin $ExcludeFolders | Get-ChildItem -File -Filter $Filter -Recurse -ErrorAction SilentlyContinue).FullName 

...zum Beitrag

Einfach erklärt durchsuchen diese zwei Zeilen alle angegebenen Laufwerke nach einer bestimmten Datei. Die erste Zeile sucht nur im Root-Verzeichnis der Laufwerke, während die zweite Zeile rekursiv alle Unterverzeichnisse durchsucht, außer den ausgeschlossenen Ordnern. Die Ergebnisse werden in der $Results-Variablen gesammelt.

...zur Antwort

mir stellen sich da ein paar Fragen.

Der Pfad : AuthUserFile meineSeite.de/cgi-bin/.htpasswd ist richtig ? 

sieht aus wie ein relativer Pfad, oder hast du diese wirklich meineSeite.de genannt ?

Du musst natürlich schauen dass der Server so konfiguriert ist, dass er htaccess Dateien berücksichtigt. Das kannst du in deiner httpd.conf oder was auch immer du für eine conf hast, durch AllowOverride bezwecken.

ungefähr so;

<Directory pfad...>
    AllowOverride All
</Directory>

hast du die Berechtigungen überprüft, so dass die Dateiem im Webserver lesbar sind ?

ansonsten schau mal im Standard Errorlog, ob es Fehler gibt/gab. Normalerweise ist der Pfad: /var/log/apache2/error.log

...zur Antwort
Probleme mit Fail2Ban?

Fail2Ban auf dem raspberry pi macht probleme. Wenn ich den status überprüfe erhalte ich diese fehlermeldung:

x fail2ban.service - Fail2Ban Service
   Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; preset: enabled)
   Active: failed (Result: exit-code) since Tue 2024-06-11 19:56:05 CEST; 3s ago
  Duration: 314ms
    Docs: man:fail2ban(1)
  Process: 3578 ExecStart=/usr/bin/fail2ban-server -xf start (code=exited, status=255/EXCEPTION)
  Main PID: 3578 (code=exited, status=255/EXCEPTION)
    CPU: 311ms

Jun 11 19:56:05 tbt systemd[1]: Started fail2ban.service - Fail2Ban Service.
Jun 11 19:56:05 tbt fail2ban-server[3578]: 2024-06-11 19:56:05,576 fail2ban.configreader  [3578]: WARNING 'allowipv6' not defined in 'Definition'. Using default one: 'auto'
Jun 11 19:56:05 tbt fail2ban-server[3578]: 2024-06-11 19:56:05,608 fail2ban        [3578]: ERROR  Failed during configuration: Have not found any log file for sshd jail
Jun 11 19:56:05 tbt fail2ban-server[3578]: 2024-06-11 19:56:05,610 fail2ban        [3578]: ERROR  Async configuration of server failed
Jun 11 19:56:05 tbt systemd[1]: fail2ban.service: Main process exited, code=exited, status=255/EXCEPTION
Jun 11 19:56:05 tbt systemd[1]: fail2ban.service: Failed with result 'exit-code'.

Es steht ja ERROR failed during configuration: Have not found any log file in sshd jail

und ERROR Async configuration of server failed.

Ich habe im jail.local den path zum ssh jail angepasst (zu logpath = /var/log/auth.log) aber es geht immer noch nicht...

...zum Beitrag

also er hat Probleme das Logfile für die sshd Jail zu finden oder zu lesen.

Dann überprüfe doch mal ob der Pfad korrekt ist... -> sudo nano /etc/fail2ban/jail.local 

dass sollte dann so hier drin stehen;

[sshd]

enabled = true

logpath = /var/log/auth.log

Ansonsten überprüfe mal die Berechtigungen -> sudo ls -l /var/log/auth.log

prüfe die beiden Dinge mal durch, wenn das nicht hilft müsste man halt weiter schauen

...zur Antwort

da steht doch was du machen sollst...

also versuch zuerstmal deinen PC neu zu starten, dass hast du ja aber hoffentlich schon in Erwägung gezogen, oder ?

wenn die Meldung nochmal kommt;

Klicke auf "Erweiterte Optionen". 

Danach gehst du in die Starteinstellungen und wählst "Computer reparieren" Windows versucht nun die Startprobleme automatisch zu beheben.

Wenn das immernoch nicht hilft, meld dich nochmal, dann muss man was anderes ausprobieren

...zur Antwort

Hallo,

das ist normalerweise kein riesen Drama.

Du hast hier mehrere Möglichkeiten

du kannst zum einen deinen PC im abgeicherten Modus starten, dass machst du, in dem du deinen PC startest und wiederholt F8 drückst, bei manchen Systemen auch Shift+F8, musst du ausprobieren. Danach kannst du den abgesicherten Modus starten. Anschließend kannst du ein neues Admin Konto erstellen -> Eingabeaufforderung öffnen (als Administrator ausführen !!!) 

(Befehl um ein neues Konto zu erstellen) -> net user NewAdmin /add 

(dem neuen Konto Admin rechte zu weisen) -> net localgroup administrators NewAdmin /add

Danach den PC neu starten und mit diesem Konto anmelden und nochmal ausprobieren

oder du machst eine allg. Systemwiederherstellung, um den Zustand vor dem Update wiederherzustellen.

-> Windows-Taste + R

-> rstrui eingeben und Enter drücken

-> dann den Anweisungen folgen

Gruß

...zur Antwort

CF7 unterstützt keine direkte Verwendung von pattern Attributen in seinen Shortcodes, das wäre mir neu. Du kannst dir allerdings mit ein paar Tricks und JavaScript ein benutzerdefiniertes pattern erstellen. Habe ich schonmal gemacht letztes Jahr für ein Projekt, ist kein Hexenwerk

...zur Antwort

Du musst nur die Bildschirmkoordinaten und die Kamera-Offset-Koordinaten durch this.canvas.zoom dividieren, um den Zoom-Faktor zu berücksichtigen. Anschließend musst du dass selbe mit der Leinwand, also (scaleX und scaleY) machen, um die angepasste Größe der Leinwand im Viewport zu berücksichtigen.

 // Apply camera position offset to screen coordinates

einfach screenPosition.x + this.camera.x * 2 in Klammern setzen und hinten dran dann / this.canvas.zoom;

 // Convert adjusted screen coordinates to canvas coordinates

hier dass selbe, nur brauchst du hier keine Klammer zu setzen

...zur Antwort

Mir ist jetzt so aufgefallen, dass du in deiner use-Methode deiner Blockklasse (AcaciaCraftingBenchBlock) nicht InteractionResult.CONSUME zurückgibst, wenn das GUI erfolgreich geöffnet wird. Also kann dein Code nicht wissen ob alles erfolgreich war. 

schau dich mal hier um ->

Block Interaction - Forge Community Wiki (gemwire.uk)

@Override
public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) {
    int x = pos.getX();
    int y = pos.getY();
    int z = pos.getZ();
    if (!world.isClientSide) {  
        AcaciaCraftingBenchOnBlockRightClickedProcedure.execute(world, x, y, z, player);
        return InteractionResult.CONSUME;  
    }
    return InteractionResult.SUCCESS;
}

probier es mal so.

Ich würde generell in so einem Projekt mit try-catch Blöcken arbeiten. Du hast in deinem Code nicht eine einzige Fehlerbehandlung wenn was schief geht. So kannst du deinen Code definitiv nicht verwenden. Mir sind auch noch viele andere Dinge aufgefallen die man grundsätzlich anderes hätte machen sollen, aber da geh ich jetzt nicht weiter drauf ein. Ändere zuerst deinen public InteractionResult use Block und schau ob dass dein Problem löst

Gruß EchoTech

...zur Antwort
Role-Based Access Control (RBAC) in Next.js?

Ich arbeite an der Implementierung einer Role-Based Access Control (RBAC) für meine API basierend auf Next.Js und möchte sicherstellen, dass ich die Best Practices für effiziente Datenbankabfragen einhalte. Meine Anwendung verwendet Next.js zusammen mit einer Backend-Datenbank ORM (drizzle-orm), um Benutzerrollen und Berechtigungen zu verwalten.

CREATE TABLE Users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(255) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE Roles (
    role_id SERIAL PRIMARY KEY,
    role_name VARCHAR(50) UNIQUE NOT NULL
);

CREATE TABLE UserRoles (
    user_id INT REFERENCES Users(user_id),
    role_id INT REFERENCES Roles(role_id),
    PRIMARY KEY (user_id, role_id)
);

CREATE TABLE Permissions (
    permission_id SERIAL PRIMARY KEY,
    permission_name VARCHAR(50) UNIQUE NOT NULL
);

CREATE TABLE RolePermissions (
    role_id INT REFERENCES Roles(role_id),
    permission_id INT REFERENCES Permissions(permission_id),
    PRIMARY KEY (role_id, permission_id)
);

CREATE TABLE Sessions (
    session_id UUID PRIMARY KEY,
    user_id INT REFERENCES Users(user_id),
    valid_until TIMESTAMP,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Derzeit werden bei jeder Anfrage die einem Benutzer zugewiesenen Rollen und Berechtigungen aus der Datenbank abgerufen, um die Zugriffsebene zu bestimmen. Ich bin jedoch besorgt über die potenziellen Auswirkungen dieses Ansatzes auf die Leistung, insbesondere wenn die Anwendung skaliert.

Was sind die besten Praktiken für die Implementierung von RBAC in Next.js bei gleichzeitiger Minimierung der Anzahl von Datenbankabfragen? Insbesondere interessiere ich mich für Strategien zur Zwischenspeicherung von Rollen- und Berechtigungsdaten, zur Optimierung der Token-basierten Autorisierung und zum Umgang mit dem Ablauf und der Ungültigkeit von Caches

...zum Beitrag

deine Abfragen sind ja jetzt nicht wirklich groß, schau dir mal an wie viele Abfragen beispielsweise bei einem statistikprogramm, erp programm,... gemacht werden. In dem Fall werden die meisten Daten durch Prozeduren abgefragt, damit man nicht wegen jeder kleinigkeit, wenn zum beispiel nur der Name gefragt wird eine neue Abfrage abschicken muss. Das ist einfach nicht effizient und würde bei mehreren Abfragen auf einmal dann irgendwann den temporären Speicher füllen.

Für solche kleinen Abfragen wie du zum beispiel, kannst du auch einfach Token verwenden, zum beispiel JSON Web Tokens, da kannst du kleinere Daten in einer json Datei Abfragen und ändern. Das geht viel schneller und spart Platz in der Datenbank. Wenn du aber auch Daten aus der DB abfägst würde ich immer JOINS verwenden zur Abfrage, um in einer Abfrage alle benötigten Informationen zu laden. Ist besser als alles einzeln Abzufragen, bei großen Daten würde das sonst die Datenbank irgendwann überlasten.

für dein vorhaben ist also eine Kombination von JWT für die Token-basierte Autorisierung, Caching (z.B. mit Redis), effiziente Datenbankabfragen und eine saubere Invalidierung des Caches bei Änderungen von Vorteil, so hast du kaum Abfragen und so gut wie keine Datenbanklast

...zur Antwort

Die Fehlermeldung erwähnt spezifisch das GRE-Protokoll. Nicht alle Mobilfunkanbieter unterstützen dieses Protokoll über ihre Netzwerke. Es könnte sein, dass dein Mobilfunkanbieter GRE-Pakete blockiert, was die VPN-Verbindung verhindert. Es könnte auch sein, dass die iPhone-Hotspot-Einstellungen oder die Netzwerkbeschränkungen deines Mobilfunkanbieters die VPN-Verbindung blockieren. Schau am betsen nochmal in deinem Vertag nach

...zur Antwort
PROGRAM PLC_PRG

VAR
  AnalogInputValue AT %IW2 : INT; (* Analogeingang *)
  Voltage : REAL;         (* Berechnete Spannung in Volt *)
END_VAR

das sind deine deklarieten Variablen, die sehen in Ordnung aus

Dein Programmcode stimmt aber nicht...

wie kommst du auf 10478 ?

Die Konstante 10478 hat nichts mit einem 10 Bit-Wert zu tun -> (0-1023) ist die Konstante

also so;

Voltage := (AnalogInputValue / 1023.0) * 11.0;
...zur Antwort

Ne, PDF-Metadaten enthalten keine Informationen über die Geräte-ID oder das Herkunftsland des Erstellers. PDF-Metadaten sind Informationen wie Titel, Autor, Erstellungsdatum, das Änderungsdatum, die Software, die zur Erstellung des Dokuments verwendet wurde, ... Diese Metadaten sind jedoch standardisiert und enthalten keine sensiblen Informationen über das Gerät oder das Herkunftsland des Erstellers.

...zur Antwort

der Text wurde in einen Container gesetzt

<body>
    <div class="container">
        <div class="content">
            <h1>Willkommen auf deinem Portal für Hyper-News!</h1>
            <p>Ein einfacher Text, der schön zentriert auf der Seite dargestellt wird.</p>
        </div>
    </div>
</body>

im css Teil wurde dann der Container und der Inhalt angepasst, so ungefähr:

body, html {
    margin: 0;
    height: 100%;
    font-family: Arial, sans-serif;
}


.container{
    display: flex;
    justify-content: center;
    text-align: center;
    height: 100vh;
}


.content{
    width: 80%;
}

Du musst dich einfach dran probieren. Css ist recht einfach. Wenn später allerdings Javascript dazu kommt, wird es etwas schwieriger. Üb dich erstmal an html, css

Gruß EchoTech

...zur Antwort

Eure while Schleifen sind leider ziemlich unschön. Diese Schleifen halten das Programm in einem Zustand fest, solange die Bedingung wahr ist. Das bedeutet, wenn einer der Sensoren aktiviert wird (Lichtwert unter 800 fällt), tritt das Programm in die entsprechende while Schleife ein und bleibt dort, bis der Wert wieder über 800 steigt. Dadurch können andere Sensoren nicht überprüft werden.

Für euer Vorhaben würde ich definitiv If anstatt while schleifen verwenden.

Ihr könntet die Logik so anpassen, dass die LED leuchtet, wenn irgendein Sensor aktiviert wird. Dies könnt ihr erreichen, indem ihr eine Variable verwendet, die den Status der LED steuert und sie entsprechend den Werten der Sensoren aktualisiert.

So könnt ihr in keine Endlosschleife kommen. Wenn ihr hilfe beim code braucht sagt bescheid

Gruß EchoTech

...zur Antwort

naja wenn man von einer 5 Tage Woche ausgeht hast du am Tag dann 10 Stunden

=NETTOARBEITSTAGE.INTL(F27;MIN(F27+8-REST(F27;7);MONATSENDE(F27;0));1)*10

verstehst du wie die Formel aufgebaut ist ? ansonsten kann ich das gerne nochmal erklären

...zur Antwort
Binärer Suchalgorithmus - wo liegt der Fehler?

Hallo liebe Community,

ich arbeite an einem Suchalgorithmus, der in einer sortierten Liste das Element finden soll, das einem gegebenen Wert am nächsten liegt. Trotz ausführlicher Tests mit über 100 Edge Cases, die alle fehlerfrei terminiert haben, liegt noch ein Fehler im Code. Bisher konnte ich jedoch keinen Fall finden, der nicht korrekt funktioniert.
Kann jemand von euch vielleicht einen Blick darauf werfen und mir helfen, mögliche Schwachstellen oder Fehler zu identifizieren? Ich wäre für jeden Tipp oder Testfall, der mein Problem offenlegen könnte, sehr dankbar!

  1.  Suche nach einem Wert 5 of 7 tests passing
  2. Die Methode 
  3. int search(int[] sortedData, int value, Result result)
  4.  soll mittels binärer Suche nach dem Index vom übergebenen Wert suchen.
  5. Dabei wird immer der mittlere Wert vom Suchbereich angesehen. Falls dies der gesuchte Wert ist, kann dessen Index zurück gegeben werden. Ansonsten verkleinert sich der Suchbereich auf die Indices, in denen der gesuchte Wert noch liegen kann. Falls der Suchbereich nur noch einen Wert enthält, soll ebenfalls abgebrochen werden.
  6. Wenn der Wert nicht im Array enthalten ist, soll stattdessen der Index vom nächst größeren oder nächst kleineren Wert zurückgegeben werden. Welcher der beiden Indices ist dabei egal, solange der zurückgegebene Index im Array liegt.
Code: 

public static int search(int[] sortedData, int value, Result result) {
     int left = 0;
    int right = sortedData.length - 1;
    int nearestindex = -1;
    int currentSmallest = Integer.MAX_VALUE;

    while(left <= right) {
        int middle = left + (right - left) / 2;
        int difference = Math.abs(value - sortedData[middle]);

        if(difference < currentSmallest) {
            currentSmallest = difference;
            nearestindex = middle;
        } else if(difference == currentSmallest) {
            if(Math.abs(value - nearestindex) > Math.abs(value - middle)) {
                nearestindex = middle;
            }
        }
        result.addStep(middle);

        if(sortedData[middle] == value) {
            return middle;
        }
        if (sortedData[middle] < value) {
            left = middle + 1;
        } else {
            right = middle - 1;
        }
    }
    return nearestindex;
}
...zum Beitrag

Du aktualisiert nearestindex basierend auf der Bedingung difference < currentSmallest. Dies sieht korrekt aus, aber die darauf folgende Bedingung (else if (difference == currentSmallest)) könnte Probleme verursachen. Die innere Bedingung vergleicht Math.abs(value - nearestindex) mit Math.abs(value - middle), was inkorrekt ist, da nearestindex ein Index und kein Wert aus sortedData ist. Die korrekte Implementierung sollte Math.abs(value - sortedData[nearestindex]) sein.

else if (difference == currentSmallest) {
  if(Math.abs(value - sortedData[nearestindex]) > Math.abs(value - sortedData[middle])) {
    nearestindex = middle;
  }
}
...zur Antwort

Hallo

In C gibt es keinen eingebauten Operator für Exponentiation.

Da es sich nur um die dritte Potenz handelt, kannst du einfach die Zahl dreimal mit sich selbst multiplizieren:

int result = 38 * 38 * 38;

Du kannst aber auch pow aus der Mathematik Bibliothek verwenden, pow arbeitet aber mit double-Typen, das kannst du also nicht immer verwenden

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

int main() {
  double result = pow(38, 3);
  printf("38 hoch 3 ist %f\n", result);
  return 0;
}
...zur Antwort

Hallo Tristan,

Dein Problem mit der Excel-Formel ist ziemlich häufig, besonders weil die Funktion FINDEN einen Fehler ausgibt, falls der gesuchte Text in der Zelle nicht vorhanden ist. Das bringt die gesamte WENN-Formel zum Abbruch.

Eine gute Lösung hierfür wäre, die Funktion ISTFEHLER in deine Formel zu integrieren. Das hilft, Fehler abzufangen, bevor sie die Ausführung der Formel stören. So könntest du deine Formel umschreiben:

=WENN(ISTFEHLER(FINDEN("Maxi"; B5)); WENN(ISTFEHLER(FINDEN("Medi"; B5)); WENN(ISTFEHLER(FINDEN("Mini"; B5)); ""; "0116"); "0117"); "0118")

Diese Version prüft jede Bedingung der Reihe nach und gibt die entsprechende Nummer aus, wenn der Text gefunden wird. Wenn keiner der Texte vorhanden ist, gibt sie einfach einen leeren String zurück. So erhältst du natürlich auch keine Probleme.

Du kannst auch WENNS benutzen (ab Version 2016), die ist ein bisschen übersichtlicher;

=WENNS(NICHT(ISTFEHLER(SUCHEN("Maxi"; B5))); "0118",
      NICHT(ISTFEHLER(SUCHEN("Medi"; B5))); "0117",
      NICHT(ISTFEHLER(SUCHEN("Mini"; B5))); "0116",
      WAHR; "")

WENNS ist praktisch, weil es direkt die erste zutreffende Bedingung nimmt und das Ergebnis ausgibt, und das alles ohne die Verschachtelung, die bei vielen WENN-Bedingungen notwendig wäre.

Gruß EchoTech

...zur Antwort